Laravel Dingo API — Как ответить несколькими коллекциями / трансформерами?

Для инициализации моего приложения у меня есть следующий маршрут:

/initialize

Это возвращает таксономии, перечислимые и пару других таксономий, таких как коллекции. Это сохраняет несколько HTTP-запросов.

Хотя с Dingo / Fractal я не вижу, как я могу ответить несколькими коллекциями?

например

return [
'taxonomies' => $this->response->collection($taxonomies, new TaxonomyTransformer);
'enumerables' => $this->response->collection($enumerables, new EnumerableTransformer);
'otherStuff' => $this->response->collection($otherStuff, new OtherStuffTransformer);
];

0

Решение

return response()->json([
'data' =>  [
'taxonomies' => $this->fractal->collection($taxonomies, new TaxonomyTransformer);
'enumerables' => $this->fractal->collection($enumerables, new EnumerableTransformer);
'otherStuff' => $this->fractal->collection($otherStuff, new OtherStuffTransformer);
]
], 200);

Это должно вернуть JSON в формате, который вы ищете.

1

Другие решения

У меня та же проблема, и я нашел решение от Как использовать Трансформер в отношениях один ко многим. # 1054.
Вот коллекция, которую я хочу вернуть с трансформером динго в моем контроллере.

$user = User::where('email','=',$input['email'])->with('departments')->with('roles')->get();

DepartmentTransformer

class DepartmentTransformer extends TransformerAbstract
{
public function transform($department)
{
return [
'id' => $department['id'],
'name' => $department['name'],
'level' => $department['level'],
'parent_id' => $department['parent_id']
];
}
}

RolesTransformer

class RolesTransformer extends TransformerAbstract
{
public function transform($role)
{
return [
'name' => $role['name'],
'slug' => $role['slug'],
'description' => $role['description'],
'level' => $role['level']
];
}

}

UserTransformer

class UserTransformer extends TransformerAbstract
{
protected $defaultIncludes = ['departments','roles'];public function transform($user)
{
return [
'id' => $user['id'],
'name' => $user['name'],
'email' => $user['email'],
'phone' => $user['phone'],
];
}public function includeDepartments(User $user)
{
$dept  = $user->departments;

return $this->collection($dept, new DepartmentTransformer());
}public function includeRoles(User $user)
{
$rl = $user->roles;

return $this->collection($rl, new RolesTransformer());
}
}

В моем контроллере

$user = User::where('email','=',$input['email'])->with('departments')->with('roles')->get();

return $this->response->collection($user, new UserTransformer());

И я получил результат

            "data": {
{
"id": 43,
"name": "test7",
"email": "test7@foxmail.com",
"phone": "186********",
"departments": {
"data": {
{
"id": 1,
"name": "业务一部",
"level": 1,
"parent_id": 0
}
}
},
"roles": {
"data": {
{
"name": "agent",
"slug": "agent",
"description": "业务员",
"level": 1
}
}
}
}
}

Обратите внимание на использование метаданных $ defaultInclude и includeXXX () в UserTransformer. Более подробную информацию вы можете получить из Фрактальный Док.

0