用 dingo 的時候 api 返回 Eloquent 模型資料的時候必須是 item 或者 collection,這時候必須用到 Transformer,但是有時候只需要簡單返回模型資料就行,沒有額外處理,但是還是需要新建一個 Transformer 類,很麻煩。
直接上乾貨,
<?php
namespace App\Transformers\Api;
use App\Transformers\BaseTransformer;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
class SimpleTransformer extends BaseTransformer
{
protected $only = [];
/**
* SimpleTransformer constructor.
* @param array $only
*/
public function __construct(array $only = [])
{
$this->only = $only;
}
public function transform($data)
{
return collect($this->only)->mapWithKeys(function ($kv, $kk) use ($data) {
$key = is_numeric($kk) ? $kv : $kk;
$value = $data->$key;
if ($value instanceof Model) {
throw new \Exception('請不要這樣使用,很容易觸發 N+1 效能問題');
} elseif ($value instanceof Carbon) {
$value = $value->toDateTimeString();
}
return [
$kv => $value
];
})->toArray();
}
}
可以這樣使用,支援別名,自動轉化時間
$currentUser = $this->user();
return $this->response->item($currentUser, new SimpleTransformer([
'id',
'name' => 'alias_name', // 支援一個別名
]));