dingo 极简 Transformer

用 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', // 支持一个别名
]));
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!