顧名思義,presenter
的原意就是呈現,展示。在這裏,它就是一個包裝器和呈現器。其主要做用就是將從repository
中查詢出來的數據將要返回( 呈現)給前端時進行從新 包裝。
當咱們的Api接口要隱藏不須要的字段時,經過在transfomer
中從新設置模型要返回的字段,而後經過presenter
對transformer
轉換器(一個或多個)進行包裹後再將數據返回給前端,而無須修改模型自己的屬性。從而實現MVC
模型中M
層和V
層的鬆耦合。php
composer require league/fractal
注意:fractal
通常在安裝I5-repository
時已經安裝好了,該擴展是用於數據轉換的,即:transfomer
,若以前安裝過dingo/api的話,也是自帶該依賴的。前端
php artisan make:transformer UserResource
命令生成的transformer
類:shell
<?php namespace App\Transformers; use App\Models\UserResource; use League\Fractal\TransformerAbstract; /** * Class UserResourceTransformer. * * @package namespace App\Transformers; */ class UserResourceTransformer extends TransformerAbstract { protected $availableIncludes = ['user']; /** * Transform the UserResource entity. * * @param \App\Models\UserResource $model * * @return array */ public function transform(UserResource $model) { } }
在transform
方法中從新設置要返回的字段:json
public function transform(UserResource $model) { return [ 'id' => $model->id, 'title' => $model->title, 'recmnd_goods' => $model->recmnd_goods, 'content' => $model->content, 'imgs' => $model->imgs, ]; }
Presenter
呈現器php artisan make:presenter UserResource
<?php namespace App\Repositories\Presenters; use App\Transformers\UserResourceTransformer; use Prettus\Repository\Presenter\FractalPresenter; /** * Class UserResourcePresenter. * * @package namespace App\Repositories\Presenters; */ class UserResourcePresenter extends FractalPresenter { /** * Transformer * * @return \League\Fractal\TransformerAbstract */ public function getTransformer() { return new UserResourceTransformer(); } }
presenter
呈現器<?php namespace App\Http\Controllers\Api; use App\Repositories\Presenters\UserResourcePresenter; use App\Repositories\Interfaces\UserResourceRepository; use App\Validators\UserResourceValidator; /** * Class UserResourcesController. * * @package namespace App\Http\Controllers\Api; */ class UserResourcesController extends CommonController { /** * @var UserResourceRepository */ protected $repository; /** * @var UserResourceValidator */ protected $validator; /** * UserResourcesController constructor. * * @param UserResourceRepository $repository * @param UserResourceValidator $validator */ public function __construct(UserResourceRepository $repository, UserResourceValidator $validator) { $this->repository = $repository; $this->validator = $validator; } /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $this->repository->pushCriteria(app('Prettus\Repository\Criteria\RequestCriteria')); $this->repository->setPresenter(UserResourcePresenter::class); $userResources = $this->repository->all(); return response()->json($userResources); } }
接口返回結果:api
{ "data": [ { "id": 1, "title": "糖尿病人的飲食規劃1", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ] }, { "id": 2, "title": "糖尿病人的飲食規劃2", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ] }, { "id": 3, "title": "糖尿病人的飲食規劃3", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ] }, { "id": 4, "title": "糖尿病人的飲食規劃4", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ] }, { "id": 39, "title": "糖尿病人的飲食規劃", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ] }, { "id": 40, "title": "糖尿病人的飲食規劃", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ] }, { "id": 41, "title": "糖尿病人的飲食規劃", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ] } ] }
大多數狀況下,接口返回的確定不止一個模型的數據,咱們須要返回更多關聯模型的數據,此時,在transfomer
轉換器中設置$availableIncludes
屬性並定義相對應的方法便可。
好比,在返回的userResource
數據中要同時帶上資源關聯的user
數據,咱們設置$availableIncludes
爲['user']
,同時建立includeUser
方法,以下所示:併發
<?php namespace App\Transformers; use App\Models\UserResource; use League\Fractal\TransformerAbstract; /** * Class UserResourceTransformer. * * @package namespace App\Transformers; */ class UserResourceTransformer extends TransformerAbstract { protected $availableIncludes = ['user']; /** * Transform the UserResource entity. * * @param \App\Models\UserResource $model * * @return array */ public function transform(UserResource $model) { return [ 'id' => $model->id, 'title' => $model->title, 'recmnd_goods' => $model->recmnd_goods, 'content' => $model->content, 'imgs' => $model->imgs, ]; } public function includeUser(UserResource $model) { $user = $model->user; return $this->item($user, new UserTransformer()); } }
上面,既然設置了關聯user
數據,那麼就要在UserRessource
模型中設置user
關聯:app
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Prettus\Repository\Contracts\Transformable; use Prettus\Repository\Traits\TransformableTrait; /** * Class UserResource. * * @package namespace App\Models; */ class UserResource extends Model implements Transformable { use TransformableTrait; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'title', 'type', 'content', 'imgs', ]; /** * 關聯用戶 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user() { return $this -> belongsTo(User::class,'user_id'); } }
include=user
:{ "data": [ { "id": 1, "title": "糖尿病人的飲食規劃1", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ], "user": { "data": { "id": 1, "nickname": "wample-1" } } }, { "id": 2, "title": "糖尿病人的飲食規劃2", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ], "user": { "data": { "id": 1, "nickname": "wample-1" } } }, { "id": 3, "title": "糖尿病人的飲食規劃3", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ], "user": { "data": { "id": 1, "nickname": "wample-1" } } }, { "id": 4, "title": "糖尿病人的飲食規劃4", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ], "user": { "data": { "id": 1, "nickname": "wample-1" } } }, { "id": 39, "title": "糖尿病人的飲食規劃", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ], "user": { "data": { "id": 1, "nickname": "wample-1" } } }, { "id": 40, "title": "糖尿病人的飲食規劃", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ], "user": { "data": { "id": 1, "nickname": "wample-1" } } }, { "id": 41, "title": "糖尿病人的飲食規劃", "recmnd_goods": "", "content": "對糖尿病人來講,如莜麥面、蕎麥麪、燕麥片、玉米麪、紫山藥等富含維生素B、多種微量元素及食物纖維,以低糖,低澱粉的食物或者粗糧以及蔬菜等作主食。豆類及豆製品,豆類食品富含蛋白質、無機鹽和維生素,且豆油含不飽和脂肪酸,能下降血清膽固醇及甘油三酯。苦瓜、桑葉、洋蔥、香菇、柚子、南瓜可下降血糖,是糖尿病人最理想食物,如能長期食用,則降血糖和預防併發症的效果會更好。", "imgs": [ "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/m8iq2GMxJcW0jba4bEx3ehHmdqdFoqqrn3HzwghC.png", "https://shiyiguan.oss-cn-beijing.aliyuncs.com/image/9Grcl2LWvYHc8IyCYr7DR1ZH4jaM3zjwcLsbDJ7q.jpeg" ], "user": { "data": { "id": 1, "nickname": "wample-1" } } } ] }