dingo 極簡 Transformer

jake666發表於2019-05-21

用 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', // 支援一個別名
]));

相關文章