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";
}