Presenter

前面提到,在 l5-repository 有兩種方式可以實作 Presenter

第一種,可以直接建立 Transformrer 並且設定他來操作 Presenter class 第二種,可以直接在 model 實作 Transform 的 interface,並且 use 預設的 Presenter ModelFractarPresenter,也能達到同樣的效果

開始使用 Presenter 之前,必須 Requires Fractal

composer require league/fractal

當我們需要對資料進行包裝時,會透過 Presenter 來處理,但實際運作的細節則是要在 Transformer 中實現

因此,實作時要同時建立 Presenter 與 Transformer

如果是直接透過 Entity 流程,會直接詢問是否建立 Presenter, Transformer

也可以手動建立

php artisan make:transformer Members

php artisan make:presenter Members

首先先看 Transformer

這裡面可以看到修飾及打包資料的流程

<?php ...
    public function transform(Members $model)
    {
        return [
            'id'         => (int) $model->id,
            /* place your other model properties here */
            'name'       => (string) $model->name,
            'email'      => (string) $model->email,
            'sexual'     => $model->sexual==1?'男':'女',
            'created_at' => $model->created_at,
            'updated_at' => $model->updated_at
        ];
    }

原則上 Presenter 不需要變更,只需確定在建立的 Presenter 裡面有正確使用到對應 Transformer 即可

<?php
    public function getTransformer()
    {
        return new MembersTransformer();
    }

可以直接在 Controller 透過 setPresenter 使用 Presenter 即可

<?php ...
    public function index()
    {
        $this->repository->setPresenter("App\\Presenters\\MembersPresenter");
        $members = $this->repository->all();

        return response()->json([
            'data' => $members
        ]);
    }

也可以將 Presenter 放在 Repository Interface 裡面

<?php ...
    /**
     * Specify Presenter
     *
     * @return mixed
     */
    public function presenter()
    {
        return "App\\Presenters\\MembersPresenter";
    }