itsdamien/laravel-model-transformer

此包已被废弃,不再维护。没有建议的替代包。

一个简单的与 Laravel 5+ 兼容的模型转换器。

v2.0.6 2020-01-06 11:03 UTC

This package is auto-updated.

Last update: 2020-09-06 12:30:08 UTC


README

itsDamien Laravel Model Transformer

Latest Stable Version Total Downloads License Build Status Maintainability Test Coverage StyleCI

此包帮助 API 开发者轻松将 Eloquent 模型转换为可转换为 JSON 的集合。

安装

使用 composer 安装

composer require itsdamien/laravel-model-transformer

使用方法

通过扩展 AbstractTransformer 类创建一个模型转换器类

class UserTransformer extends \ItsDamien\Transformer\AbstractTransformer
{
    public function model($model)
    {
        return [
            'first_name' => $model->first_name,
            'last_name'  => $model->last_name,
            'full_name'  => $model->first_name.' '.$model->last_name,
            'photos'     => PhotoTransformer::transform($model->photos),
        ];
    }
}

现在您可以从任何控制器中调用转换器

return response([
    "user" => UserTransformer::transform(User::find(1))
]);

// Output:
// {
//     "user":{
//         "first_name":"John",
//         "last_name":"Doe",
//         "full_name":"John Doe",
//         "photos":[]
//     }
// }

您也可以传递一个集合,结果将是一个转换后的模型集合

return response([
    "users" => UserTransformer::transform(User::all())
]);

// Output:
// {
//     "users":[
//         {
//             "first_name":"John",
//             "last_name":"Doe",
//             "full_name":"John Doe",
//             "photos":[]
//         },
//         {
//             "first_name":"Dolores",
//             "last_name":"Abernathy",
//             "full_name":"Dolores Abernathy",
//             "photos":[]
//         },
//     ]
// }

向转换器传递选项

您可能需要从控制器向转换器传递一些选项,您可以通过向 transform() 方法提供选项数组作为第二个参数来实现这一点

UserTransformer::transform($user, ['foo' => 'bar']);

现在从 UserTransformer 内部可以检查选项参数

class UserTransformer extends \ItsDamien\Transformer\AbstractTransformer
{
    public function model($model)
    {
        return [
            'first_name' => $model->first_name,
            'last_name'  => $model->last_name,
            'full_name'  => $model->first_name.' '.$model->last_name,
            'foo'        => $this->options['foo'],
        ];
    }
}

复杂转换器

您的转换器将始终通过 model 方法转换模型。然后您可以通过向 transform() 方法添加 withwithout 方法来修改转换器,作为第三个参数

class UserTransformer extends \ItsDamien\Transformer\AbstractTransformer
{
    public function model($model)
    {
        return collect([
            'first_name' => $model->first_name,
            'last_name'  => $model->last_name,
            'full_name'  => $model->first_name.' '.$model->last_name,
        ]);
    }
    
    public function withId($model, \Illuminate\Support\Collection $collection)
    {
        return $collection->merge(collect([
            'id' => $model->id,
        ]));
    }
    
    public function withoutFullname($model, \Illuminate\Support\Collection $collection)
    {
        return $collection->except('full_name');
    }
}

现在调用转换器

return UserTransformer::transform(User::find(1));

// Output:
// {
//     "first_name":"John",
//     "last_name":"Doe",
//     "full_name":"John Doe"
// }
return UserTransformer::transform(User::find(1), [], ['withId']);

// Output:
// {
//     "id":1,
//     "first_name":"John",
//     "last_name":"Doe",
//     "full_name":"John Doe"
// }
return UserTransformer::transform(User::find(1), [], ['withoutFullname']);

// Output:
// {
//     "first_name":"John",
//     "last_name":"Doe",
// }
return UserTransformer::transform(User::find(1), [], ['withId', 'withoutFullname']);

// Output:
// {
//     "id":1,
//     "first_name":"John",
//     "last_name":"Doe",
// }