2016-07-02 4 views
0

Чтобы инициализировать мое приложение у меня есть следующий маршрут: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); 
]; 

ответ

1
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 в формате, который вы ищете.

+0

Это не работает, так как коллекция '$ this-> response-> (...' будет включать в себя обычную информацию ответа, такую ​​как '{заголовки, исключения}' – AndrewMcLagan

+0

Какие заголовки и исключения? Для каждого ресурса или тех, являются общими заголовками и исключениями? – Ruffles

+0

О, я вижу, вы не должны заменять '$ this-> response-> collection()' с помощью фрактальных объектов для каждого класса, например: '$ this-> fractal-> collection ($ taxonomies, новый TaxonomyTransformer) ' Итак, вы можете получить значения там и иметь один объект ответа вместо одного для каждого класса? – Ruffles

0

У меня такая же проблема, и я нашел решение от How to use Transformer in one to many relationship. #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": "[email protected]", 
       "phone": "186********", 
       "departments": { 
       "data": { 
        { 
         "id": 1, 
        "name": "业务一部", 
        "level": 1, 
        "parent_id": 0 
        } 
       } 
       }, 
       "roles": { 
       "data": { 
        { 
         "name": "agent", 
        "slug": "agent", 
        "description": "业务员", 
        "level": 1 
        } 
       } 
       } 
      } 
      } 

Пожалуйста, обратите внимание на использование $ defaultIncludes и includeXXX() methonds в UserTransformer.You может получить больше информации деталь от Fractal Doc.

+1

Хотя ссылка на потенциальное решение всегда приветствуется, ответ на переполнение стека всегда должен содержать основные части/точки решения в самом теле ответа. Просто ссылка на решение без каких-либо комментариев не считается приемлемым ответом. См. [Ask] о том, как сформулировать правильный ответ. – Magisch

 Смежные вопросы

  • Нет связанных вопросов^_^