- 首先明确transformer 的一个作用就是转成数组,其次是隐藏和改下某些字段名——自定义字段名。
- transformer的传参方式,在构造函数中获取参数
$this->response()->item($recommend, new SingleClassTransformer($param));
transformer 更多方法的诞生 ,比如关联表返回数据
demo1 多对多:
RolesTransformer
class RolesTransformer extends TransformerAbstract
{
public function transform($role)
{
return [
'name' => $role['name'],
'description' => $role['description'],
'level' => $role['level']
];
}
UserTransformer
class UserTransformer extends TransformerAbstract
{
//这个是重点
protected $defaultIncludes = ['roles'];
public function transform($user)
{
return [
'id' => $user['id'],
'name' => $user['name'],
'email' => $user['email'],
'phone' => $user['phone'],
'level' => $user['level']
];
}
public function includeRoles(User $user)
{
$role = $user->roles;
return $this->collection($role , new RolesTransformer());
}
}
控制器
$user = User::where('email','=',$input['email'])->with('roles')->get();
return $this->response->collection($user, new UserTransformer());
返回
"data": {
{
"id": 1,
"name": "test",
"email": "123@qq.com",
"phone": "12333333",
"roles": {
"data": {
{
"name": "xxx",
"description": "普通用户",
"level": 3
}
}
}
}
}
demo2 一对多:例如新闻+评论
NewsTransformer.php
public function transform($item)
{
return [
'id' => $item->id,
'title' => $item->title,
'created_at' => $item->created_at . '',
'content' => $item->content,
'comments' => $this->transformComments($item->comments()->take(3)->get()),
'comments_count' => $item->comments->count(),
];
}
public function transformComments($comments)
{
//这里不可以使用array_map,转换为数组后会导致NewsCommentsTransformer里面获取错误。
$array = [];
foreach ($comments as $news_comments){
$array[count($array)] = (new NewsCommentsTransformer)->transform($news_comments);
}
return $array;
}
NewsCommentsTransformer
public function transform($item)
{
return [
'id' => $item->id,
'content' => $item->content,
'userid' => $item->user_id,
'username' => $item->user->name,
'created_at' => $item->created_at . ''
];
}
最后,感谢其他博主的博文以及回答问题的,如下
https://github.com/dingo/api/issues/1054
https://github.com/dingo/api/issues/986#issuecomment-230947533
https://www.codecasts.com/discuss/laravel/development-problems-api-476
…
补上 统一处理异常 学习地址 https://github.com/dingo/api/issues/411