Laravel - Route :: resource vs Route :: controller

138

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

Une des réponses a indiqué que 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 sœurs:

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

Comment pouvons-nous choisir quoi utiliser? Qu'est-ce qu'une bonne pratique?

Sonique
la source
12
Juste une note pour les utilisateurs de Laravel 5.2, les contrôleurs implicites sont obsolètes.
Roy

Réponses:

283

Contrôleur de ressources RESTful

Un contrôleur de ressources RESTful configure pour vous des 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 quelque chose comme ceci (actions = méthodes)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Vous pouvez également choisir les actions 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 dirigé vers vos méthodes de contrôleur en fonction du type et du nom de la requête HTTP. Cependant, vous n'avez pas défini de noms d'itinéraire pour vous et il capturera tous les sous-dossiers pour le même itinéraire.

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

Vous conduirait à configurer le contrôleur avec une sorte de schéma de dénomination 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


Il est recommandé 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 déroutants lors de l'utilisation php artisan routes. J'utilise généralement des contrôleurs de ressources RESTful en combinaison avec des routes explicites.

Ryanwinchester
la source
1
Si nous utilisons plusieurs routes de ressources (peut-être index, show), pourquoi ne pas utiliser des routes statiques Route :: get (...)? Je pense que ce n'est pas mieux, pas pire que d'utiliser array ('only' => array ('index', 'show'). Et quelle méthode utilisée pour le contrôleur RESTFull lorsque nous demandons quelque chose comme 'user / 123', getIndex () fonctionne pour 'user /' mais avec user / 123 j'obtiens l'erreur NotFoundHttpException (essayé différents noms getView et autres, ne fonctionne que lorsque déclaré en tant que Controller @ getView)?
Sonique
Quelqu'un peut-il préciser à quoi sert «resource.edit»? C'est une méthode GET, donc je suppose qu'elle est censée fournir des informations complètes sur une ressource, plutôt que des informations limitées via 'resource.show'?
Anthony
1
@Anthony - resource.editconsiste à afficher une vue d'édition, essentiellement le formulaire d'édition d'une ressource existante.
ryanwinchester
@fungku C'est intéressant ... alors dites-vous que resource.edit renverrait en fait du HTML au lieu de JSON?
Anthony
2
@Anthony En général, (et pour autant que je sache) oui. resource.editet resource.createsont généralement pour une interface utilisateur ... rendant une vue avec des formulaires HTML. Ces formulaires PUT / POST à resource.updateet resource.storerespectivement. Si vous ne le faites pas, vous pouvez simplement les ignorer et vous débarrasser des méthodes edit () et create () de votre contrôleur.
ryanwinchester
3

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

Et la méthode des ressources est utilisée pour créer plusieurs itinéraires pour gérer une variété d'actions de repos.

Voici la documentation Laravel à ce sujet.

Ahmad Sharif
la source