andersao/l5-repository-使用教程之-呈現器Presenter的使用

presenter的概念

顧名思義, presenter的原意就是呈現,展示。在這裏,它就是一個包裝器和呈現器。其主要做用就是將從 repository中查詢出來的數據將要返回( 呈現)給前端時進行從新 包裝

使用場景

當咱們的Api接口要隱藏不須要的字段時,經過在transfomer中從新設置模型要返回的字段,而後經過presentertransformer轉換器(一個或多個)進行包裹後再將數據返回給前端,而無須修改模型自己的屬性。從而實現MVC模型中M層和V層的鬆耦合。php

使用

安裝fractal(通常不須要此步驟,可跳過)

composer require league/fractal

注意:fractal通常在安裝I5-repository時已經安裝好了,該擴展是用於數據轉換的,即:transfomer,若以前安裝過dingo/api的話,也是自帶該依賴的。前端

建立 Tramsformer

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"
                }
            }
        }
    ]
}
相關文章
相關標籤/搜索