Laravel - Route :: resource vs Route :: controller


138

Ich habe die Dokumente auf der Laravel-Website, Stack Overflow und Google gelesen, verstehe aber den Unterschied zwischen Route::resourceund immer noch nicht Route::controller.

Eine der Antworten besagte, dass Route :: resource für Rohöl war. Mit Route :: controller können wir jedoch dasselbe erreichen wie mit Route :: resource und nur die erforderlichen Aktionen angeben.

Sie scheinen wie Geschwister zu sein:

Route::controller('post','PostController');
Route::resource('post','PostController');

Wie können wir auswählen, was verwendet werden soll? Was ist eine gute Praxis?


12
Nur ein Hinweis für Laravel 5.2-Benutzer, während implizite Controller veraltet sind.
Roy

Antworten:


281

RESTful Resource Controller

Ein RESTful-Ressourcencontroller richtet einige Standardrouten für Sie ein und benennt sie sogar.

Route::resource('users', 'UsersController');

Gibt Ihnen diese benannten Routen:

Verb          Path                        Action  Route Name
GET           /users                      index   users.index
GET           /users/create               create  users.create
POST          /users                      store   users.store
GET           /users/{user}               show    users.show
GET           /users/{user}/edit          edit    users.edit
PUT|PATCH     /users/{user}               update  users.update
DELETE        /users/{user}               destroy users.destroy

Und Sie würden Ihren Controller so einrichten (Aktionen = Methoden)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Sie können auch auswählen, welche Aktionen wie folgt eingeschlossen oder ausgeschlossen werden sollen:

Route::resource('users', 'UsersController', [
    'only' => ['index', 'show']
]);

Route::resource('monkeys', 'MonkeysController', [
    'except' => ['edit', 'create']
]);

RESTful Resource Controller-Dokumentation


Impliziter Controller

Ein impliziter Controller ist flexibler. Sie werden basierend auf dem HTTP-Anforderungstyp und -Namen an Ihre Controller-Methoden weitergeleitet. Sie haben jedoch keine Routennamen für Sie definiert und es werden alle Unterordner für dieselbe Route abgefangen.

Route::controller('users', 'UserController');

Würde Sie dazu bringen, den Controller mit einer Art RESTful-Namensschema einzurichten:

class UserController extends BaseController {

    public function getIndex()
    {
        // GET request to index
    }

    public function getShow($id)
    {
        // get request to 'users/show/{id}'
    }

    public function postStore()
    {
        // POST request to 'users/store'
    }

}

Implizite Controller-Dokumentation


Es ist empfehlenswert, das zu verwenden, was Sie benötigen. Ich persönlich mag die impliziten Controller nicht , weil sie chaotisch sein können, keine Namen angeben und bei der Verwendung verwirrend sein können php artisan routes. Normalerweise verwende ich RESTful Resource Controller in Kombination mit expliziten Routen.


1
Wenn wir mehrere Ressourcenrouten verwenden (möglicherweise Index, Show), warum nicht statische Routen verwenden Route :: get (...)? Ich denke, es ist nicht besser, nicht schlechter als Array zu verwenden ('only' => array ('index', 'show'). Und für welche Methode, die für RESTFull-Controller verwendet wird, wenn wir etwas wie 'user / 123' anfordern, funktioniert getIndex () 'user /' aber mit user / 123 erhalte ich den Fehler NotFoundHttpException (habe verschiedene Namen getView und andere ausprobiert, funktioniert nur, wenn als Controller @ getView deklariert)?
Sonique

Kann jemand klären, wofür 'resource.edit' gedacht ist? Da es sich um eine GET-Methode handelt, gehe ich davon aus, dass sie vollständige Informationen zu einer Ressource enthalten soll und nicht nur begrenzte Informationen über 'resource.show'.
Anthony

1
@Anthony - resource.editzeigt eine Bearbeitungsansicht an, im Grunde das Formular zum Bearbeiten einer vorhandenen Ressource.
Ryanwinchester

@fungku Das ist interessant. Wollen Sie damit sagen, dass resource.edit tatsächlich HTML anstelle von JSON zurückgibt?
Anthony

2
@Anthony Im Allgemeinen (und soweit ich weiß) ja. resource.editund resource.createsind in der Regel für eine Benutzeroberfläche ... Rendern einer Ansicht mit HTML-Formularen. Diese Formulare würden PUT / POST resource.updateund resource.storejeweils. Wenn Sie dies nicht tun, können Sie sie einfach ignorieren und die Methoden edit () und create () in Ihrem Controller entfernen.
Ryanwinchester

3

Für die Routensteuerungsmethode müssen wir nur eine Route definieren. Bei der Get- oder Post-Methode müssen wir die Route separat definieren.

Mit der Ressourcenmethode werden mehrere Routen erstellt, um eine Vielzahl von Restful-Aktionen auszuführen.

Hier die Laravel- Dokumentation dazu.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.