2017-02-19 13 views
0

У меня есть служба RESTful, доступная конечным точкам.Как изменить ответ в Laravel?

Например, я запрашиваю api/main и получаю данные JSON с сервера.

Для ответа я использую:

return response()->json(["categories" => $categories]); 

Как контролировать формат ответа передачи параметров в URL?

В качестве образца мне нужно следующее: api/main?format=json|html, что он будет работать для каждого response в контроллерах.

+0

Как вы отформатируете ответ с помощью 'HTML'? –

+0

Он должен вернуть 'View' – Darama

+0

Есть ли что-нибудь, что вы пробовали? –

ответ

1

Вы можете использовать для этого Response macros. Например, в AppServiceProvider внутри boot метода вы можете добавить:

\Response::macro('custom', function($view, $data) { 
    if (\Request::input('format') == 'json') { 
      return response()->json($data); 
    } 
    return view($view, $data); 
}); 

и в контроллере вы можете теперь использовать:

$data = [ 
    'key' => 'value', 
]; 

return response()->custom('your.view', $data); 

Если вы бежите в настоящее время, например GET /categories вы получите обычный HTML-страницы, но если вы запустите GET /categories?format=json, вы получите ответ Json. Однако в зависимости от ваших потребностей вам может потребоваться настроить его гораздо больше, чтобы обрабатывать, например, также перенаправления.

0

С вашим примером параметра format запроса кода контроллер будет выглядеть примерно так:

public function main(Request $request) 
{ 
    $data = [ 
     'categories' => /* ... */ 
    ]; 

    if ($request->input('format') === 'json') { 
     return response()->json(data); 
    } 

    return view('main', $data); 
} 

В качестве альтернативы можно просто проверить, если входящий запрос является вызов AJAX через $request->input('format') === 'json' с $request->ajax()

+0

Проблема в том, что я не хочу писать этот код в каждом контроллере, мне нужен СУХОЙ принцип. – Darama

+0

Ничего не мешает вам извлечь общую логику в вспомогательный метод. – nCrazed

+0

И, как предположил Росс, вы можете вернуть массив '$ data' из контроллера и позволить преобразованию дескриптора промежуточного программного обеспечения в правильный тип ответа. – nCrazed

0

Один из вариантов используйте для этого Middleware. В приведенном ниже примере предполагается, что вы всегда будете возвращать view('...', [/* some data */]).

Что нужно сделать, это проверить, должен ли формат быть json, и если да, то получите данные, которые были вставлены в представление из ответа, и просто верните это вместо этого. Затем вы просто примените это промежуточное ПО к маршрутам, которые могут быть возвращены json и html.

public function handle($request, Closure $next) 
{ 
    $response = $next($request); 

    if ($request->input('format') == 'json') { 

     $response->setContent(
      $this->getDataFromResponse($response) 
     ); 

    } 

    return $response; 
} 

/** 
* Get the data that was pasted to the view 
* 
* @param \Illuminate\Http\Response $response 
*/ 
protected function getDataFromResponse($response) 
{ 
    $content = $response->getOriginalContent(); 

    return $content->getData(); 
} 

Надеюсь, это поможет!