web-dev-qa-db-fra.com

Laravel - Route :: ressource vs Route :: contrôleur

J'ai lu la documentation sur le site Web Laravel, Stack Overflow et Google, mais je ne comprends toujours pas la différence entre Route::resource et Route::controller.

Une des réponses a dit Route :: resource était pour crud. Cependant, avec Route :: controller, nous pouvons accomplir la même chose qu'avec Route :: resource et nous ne pouvons spécifier que les actions nécessaires.

Ils semblent être comme des frères et soeurs:

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

Comment pouvons-nous choisir quoi utiliser? Quelle est la bonne pratique?

115
Sonique

Contrôleur de ressources RESTful

Un contrôleur de ressources RESTful configure pour vous certaines routes par défaut et les nomme même.

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

Vous donne ces itinéraires nommés:

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

Et vous configureriez votre contrôleur à peu près comme ceci (actions = méthodes)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Vous pouvez également choisir quelles actions sont incluses ou exclues comme ceci:

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

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

documentation du contrôleur de ressources RESTful


Contrôleur implicite

Un contrôleur implicite est plus flexible. Vous êtes routé vers les méthodes de votre contrôleur en fonction du type et du nom de la requête HTTP. Cependant, aucun nom d’itinéraire n’a été défini pour vous et tous les sous-dossiers seront capturés pour le même itinéraire.

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

Cela vous amènerait à configurer le contrôleur avec une sorte de schéma de nommage RESTful:

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'
    }

}

documentation du contrôleur implicite


C'est une bonne pratique d'utiliser ce dont vous avez besoin, selon vos préférences. Personnellement, je n'aime pas les contrôleurs implicites , car ils peuvent être compliqués, ne fournissent pas de noms et peuvent être source de confusion lorsque vous utilisez php artisan routes . J'utilise généralement des contrôleurs de ressources RESTful en combinaison avec des routes explicites.

237
ryanwinchester

Pour la méthode du contrôleur d'itinéraire, nous devons définir un seul itinéraire. Dans la méthode get ou post, nous devons définir la route séparément.

Et la méthode des ressources est utilisée pour créer plusieurs itinéraires permettant de gérer diverses actions reposantes.

Ici le Laravel documentation à ce sujet.

3
Ahmad Sharif