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?

Sonique
quelle
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.

Ryanwinchester
quelle
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.

Ahmad Sharif
quelle