2017-02-19 7 views
0

Ich habe RESTful Service, der von Endpunkten verfügbar ist.Wie ändere ich die Antwort in Laravel?

Zum Beispiel, ich Anfrage api/main und JSON-Daten vom Server abrufen.

Für Antwort, die ich verwende:

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

Wie Format der Antwort auf Steuerparameter in URL übergeben?

Als Beispiel brauche ich: api/main?format=json|html, dass es für jede response in Controller funktioniert.

+0

Wie würden Sie die Antwort mit 'HTML' formatieren? –

+0

Es sollte 'View' zurückgeben – Darama

+0

Gibt es etwas, das Sie bisher versucht haben? –

Antwort

1

Sie können dafür Response macros verwenden. Zum Beispiel in AppServiceProvider innerhalb boot Methode können Sie hinzufügen:

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

und in Ihrem Controller können Sie jetzt:

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

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

Wenn Sie jetzt laufen zum Beispiel GET /categories Sie normale HTML-Seite bekommen, aber wenn Sie laufen GET /categories?format=json Sie erhalten Json Antwort. Je nach Ihren Anforderungen müssen Sie es jedoch möglicherweise viel mehr anpassen, um beispielsweise auch Umleitungen zu handhaben.

0

Mit Ihrer format Abfrageparameter Beispiel der Code-Controller wie folgt aussehen würde:

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

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

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

Alternativ können Sie einfach überprüfen, ob die eingehende Anfrage ist ein AJAX-Aufruf via $request->input('format') === 'json' mit $request->ajax()

+0

Problem ist, dass ich diesen Code nicht in jedem Controller schreiben möchte, ich brauche DRY-Prinzip. – Darama

+0

Es gibt nichts, was Sie davon abhält, die allgemeine Logik in eine Hilfsmethode zu extrahieren. – nCrazed

+0

Und wie von Ross vorgeschlagen, könnten Sie das Array "$ data" vom Controller zurückgeben und eine benutzerdefinierte Middleware die Konvertierung in den richtigen Antworttyp vornehmen lassen. – nCrazed

0

Eine Möglichkeit wäre, um dafür Middleware zu verwenden. Im folgenden Beispiel wird davon ausgegangen, dass Sie immer view('...', [/* some data */]) zurückgeben werden.

Was das Folgende tun wird, ist zu überprüfen, ob das Format json sein sollte, und wenn ja, holen Sie die Daten, die aus der Antwort in die Ansicht eingefügt wurden, und geben Sie diese stattdessen zurück. Sie wenden diese Middleware dann nur auf die Routen an, die json und html zurückgegeben werden können.

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(); 
} 

Hoffe, das hilft!

Verwandte Themen