2014-06-24 9 views
5

Ich habe RESTful controllers in meinem Laravel-Projekt verwendet. Durch die Einbeziehung:Kann die Modellbindung mit RESTful-Controllern verwendet werden?

Route::controller('things', 'ThingController') 

in meinem routes.php, kann ich definieren Funktionen in dem ThingController wie:

public function getDisplay($id) { 
    $thing = Thing::find($id) 
    ... 
} 

so, dass immer die URL“... Dinge/Anzeige/1" automatisch sein würde, auf die Controller-Funktion gerichtet. Das scheint ziemlich praktisch zu sein und funktioniert bisher großartig für mich.

Ich bemerkte, dass viele meiner Controller-Funktionen mit dem Abrufen eines Modells nach ID aus der URL begannen, und ich dachte, es wäre schön, route model binding stattdessen für mich verwenden zu können. So aktualisiert ich meine routes.php zu

Route::model('thing', 'Thing'); 
Route::controller('things', 'ThingController') 

und änderte die ThingController Funktionen

public function getDisplay($thing) { 
    ... 
} 

Ich nahm diese magische Weise so, wie ich es wollte funktionieren würde (wie alles andere, was ich habe versucht, so weit in Laravel hat) aber leider bekomme ich "Versuch, Eigenschaft von Nicht-Objekt zu bekommen", wenn ich versuche, $thing in der Funktion zu verwenden. Ist das etwas, was funktionieren könnte und ich es einfach falsch gemacht habe oder Modellbindung nur mit Routen arbeiten kann, die explizit in routes.php benannt sind?

Antwort

4

Wenn Sie nicht mit URI-Pfad, Methodennamen Geist und arbeitet gerade nur show, edit und update Methode können Sie Resource Controller verwenden URI-Zeichenfolge zu erzeugen, das Modell verbindlich definieren.

In routes.php Änderung

Route::model('things', 'Thing'); 
Route::resource('things', 'ThingController'); 

können Sie php artisan routes Befehl verwenden, um alle URIs

$ artisan routes | grep ThingController 
GET|HEAD things    | things.index    | [email protected] 
GET|HEAD things/create   | things.create    | [email protected] 
POST things     | things.store    | [email protected] 
GET|HEAD things/{things}  | things.show    | [email protected] 
GET|HEAD things/{things}/edit | things.edit    | [email protected] 
PUT things/{things}   | things.update    | [email protected] 
PATCH things/{things}   |       | [email protected] 

Danach sehen Sie, ohne explizit Routennamen Bedrohungsparameter als Thing Objekt kann.

/** 
* Display the specified thing. 
* 
* @param Thing $thing 
* @return mixed 
*/ 
public function show(Thing $thing) 
{ 
    return $thing->toJson(); 
} 

Wenn Sie [email protected] zugreifen möchten, übergeben Sie Ihre Modell-ID und Laravel wird es automatisch abgerufen werden.

http://example.com/things/1

{"id":1,"type":"Yo!"} 
1

können Sie Strecke verwenden: Ressourcen- und noch andere Methoden zur Verfügung stellen. Platzieren Sie die Route, die Sie benötigen, kurz vor dieser bestimmten Route::resource Linie. ZB:

Route::model('things', 'Thing'); 
Route::get('things/{things}/owner', '[email protected]'); 
Route::resource('things', 'ThingController'); 

dann die entsprechende Methode in Ihrem Controller erstellen.

public function getOwner($things) { 
    return Response::json($things->owner()->get()); 
} 

Hier ist die offizielle Dokumentation von Laravel 4.2 docs:

Quelle: http://laravel.com/docs/controllers#resource-controllers

Weitere Routen Hinzufügen von Controllern zur Ressource

Wenn es notwendig wird, für Sie zusätzliche Routen zu einer Ressourcensteuerung über die Standard-Ressourcen-Routen hinzufügen, können Sie diese Routen definieren sollten vor Ihr Anruf an Route::resource:

Route::get('photos/popular'); 
Route::resource('photos', 'PhotoController'); 
Verwandte Themen