, (*1)
, (*2)
This package helps API developers to easily transform Eloquent models into collection that are convertible to JSON., (*3)
Installation
Installation using composer:, (*4)
composer require itsdamien/laravel-model-transformer
Usage
Create a model transformer class by extending the AbstractTransformer class:, (*5)
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),
];
}
}
Now you can call the transformer from any controller:, (*6)
return response([
"user" => UserTransformer::transform(User::find(1))
]);
// Output:
// {
// "user":{
// "first_name":"John",
// "last_name":"Doe",
// "full_name":"John Doe",
// "photos":[]
// }
// }
You can also pass a collection and the result will be an collection of transformed models:, (*7)
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":[]
// },
// ]
// }
You may need to pass some options from the controller to the transformer, you can do that by providing an array of options to the transform() method as a second parameter:, (*8)
UserTransformer::transform($user, ['foo' => 'bar']);
Now from inside the UserTransformer you can check the options parameter:, (*9)
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'],
];
}
}
Your transformer will always transform your model with the model method. Then you can alter the transformer by adding your with or without methods to the transform() method as a third parameter:, (*10)
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');
}
}
Now call the transformer:, (*11)
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",
// }