2015-08-07 2 views
9

Ich möchte eine Laravel 5.1-Anwendung für Web und APIs für mobile Anwendungen erstellen. Ich möchte JSON für eine API-Anfrage zurückgeben und für den Webbrowser anzeigen. Zur Zeit habe ich verschiedene Routen und verschiedene Controller eingerichtet. Bei diesem Ansatz wiederhole ich den Code. Ich weiß nicht, was der beste Ansatz ist, um diese Architektur zu entwerfen. Außerdem habe ich einige ähnliche Threads durchlaufen, die die Verwendung von angular.js für den Webbrowser empfehlen.Wie Laravel 5.1-Anwendung für Web-Client und native mobile Anwendungen zu entwickeln

+0

Ich weiß nicht, Wetter das ist in Laravel oder nicht anwendbar, aber wir können Gruppen/Namespaces in Rubyonrails für den angegebenen Zweck erstellen. Überprüfen Sie diese http://laravel-tricks.com/tricks/route-group-namespacing –

Antwort

1

Ein Weg wäre content negotiation Ansatz zu verwenden. Sie würden Header übergeben Accept: application/json und dann Ihre App würde Antwort im JSON-Format zurückgeben. Einige Proxy-Server respektieren die Inhaltsverhandlung jedoch nicht. Dann würde Ihre App durchbrechen (Sie können mehr darüber lesen, warum Drupal die Inhaltsverhandlung here fallengelassen hat).

Eine andere Möglichkeit ist, tu etwas GET Variable gewünschten Format zurück, zum Beispiel:

Route::get('/api/product', ['as' => 'product', function(){ 
    return App::make('ProductController')->index('json'); 
}]); 

public function index($format) { 
    // Your controller code 

    if ($format == 'json') { 
     // return JSON 
    } 

    // return HTML 
} 

Oder Sie können URI analysieren direkt und sehen, ob: /api/product?format=json

Auch Sie können Variablen aus /api Anrufe passieren Es beginnt mit /API (nicht zu empfehlen). Meine Auswahl wäre Content Negotiation und/oder format GET Variable.

+0

Nun, ich kann es auf diese Weise hacken, aber ich möchte es so sauber wie möglich tun, indem ich mich auf die Gestaltung einer besseren Architektur konzentrieren – Ashish

+0

versuchen Dingo/api es ist ordentlich und unterstützt Versionierung, die meisten Authentifizierungsmethoden. – astroanu

2

Sie können zwei grundlegende Ansätze haben:

  • getrennt halten Routen und Controller, sondern alle Ihre gemeinsamen Controller-Code in einen Dienst bewegen. Dies ist wahrscheinlich die sauberste und flexibelste Lösung, da es die Aktualisierung von API- und Webmethoden in Zukunft sehr einfach macht.
  • Oder Sie können sowohl API-und Web-Anfragen an den gleichen Controller, übergeben Sie das Request-Objekt hinein und dann basierend auf einigen Anfrage-Attribut entscheiden, welche Antwort, json oder html zurückzugeben.

Für den zweiten Ansatz könnte man zum Beispiel tun es wie folgt aus:

// web controller 
Route::resource('product', 'ProductController'); 

// api controller 
Route::group(['prefix' => 'api'], function() { 
    Route::resource('product', 'ProductController'); 
}); 

// and in the ProductController you have 
public function index(Request $request) 
{ 
    // do some stuff... 

    if ($request->segment(1) === 'api') { // route prefix was api 
     // return json 
    } else { 
     // return the view 
    } 
} 

Sie könnten auch $ request-> wantsJson() Methode zu überprüfen, auf Accept: Header oder Sie können eine spezielle GET verwenden passieren Variable (zB ?_format=json) mit allen API-Aufrufen zur Definition des Antwortformats sollte json sein, wie bereits von @Bogdan Kuštan vorgeschlagen. IMHO, wenn Sie bereits API-Präfix auf Ihren URLs verwenden, ist es zuverlässiger und sauberer, nur um das zu überprüfen.

+0

Danke @ivanhoe. Ich benutze Repository-Designmuster und verschiebe dort meine gemeinsame Logik. Geben Sie auf der Steuerung an, dass Sie die Schnittstelle andeuten und auf die üblichen Methoden zugreifen. – Ashish

Verwandte Themen