itsdamien / laravel-model-transformer
此包已被废弃,不再维护。没有建议的替代包。
一个简单的与 Laravel 5+ 兼容的模型转换器。
v2.0.6
2020-01-06 11:03 UTC
Requires
- php: >=5.6.4
README
此包帮助 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()
方法添加 with
或 without
方法来修改转换器,作为第三个参数
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", // }