Laravel - Ruta :: recurso vs Ruta :: controlador

138

Leí los documentos en el sitio web de Laravel, Stack Overflow y Google, pero aún no entiendo la diferencia entre Route::resourcey Route::controller.

Una de las respuestas decía que Route :: resource era para crud. Sin embargo, con Route :: controller podemos lograr lo mismo que con Route :: resource y podemos especificar solo las acciones necesarias.

Parecen ser como hermanos:

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

¿Cómo podemos elegir qué usar? ¿Qué es una buena práctica?

Sonique
fuente
12
Solo una nota para los usuarios de Laravel 5.2, mientras que los controladores implícitos están en desuso.
Roy

Respuestas:

283

Controlador de recursos RESTful

Un controlador de recursos RESTful configura algunas rutas predeterminadas para usted e incluso las nombra.

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

Te da estas rutas con nombre:

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

Y configuraría su controlador de esta manera (acciones = métodos)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

También puede elegir qué acciones se incluyen o excluyen de esta manera:

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

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

Documentación del controlador de recursos RESTful


Controlador implícito

Un controlador implícito es más flexible. Se le enrutará a los métodos de su controlador en función del tipo y el nombre de la solicitud HTTP. Sin embargo, no tiene nombres de ruta definidos para usted y capturará todas las subcarpetas para la misma ruta.

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

Le llevaría a configurar el controlador con una especie de esquema de nombres 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'
    }

}

Documentación implícita del controlador


Es una buena práctica usar lo que necesita, según su preferencia. Personalmente no me gustan los controladores implícitos , porque pueden ser desordenados, no proporcionan nombres y pueden ser confusos cuando se usan php artisan routes. Normalmente uso controladores de recursos RESTful en combinación con rutas explícitas.

ryanwinchester
fuente
1
Si usamos varias rutas de recursos (quizás indexar, mostrar) ¿por qué no usar rutas estáticas Route :: get (...)? Creo que no es mejor ni peor que usar array ('only' => array ('index', 'show'). Y qué método se usa para el controlador RESTFull cuando solicitamos algo como 'user / 123', getIndex () funciona para 'user /' pero con user / 123 me sale el error NotFoundHttpException (probé diferentes nombres getView y otros, solo funciona cuando declaro como Controller @ getView)
Sonique
¿Alguien puede aclarar para qué está destinado 'resource.edit'? Es un método GET, así que supongo que se supone que contiene información completa sobre un recurso, en lugar de solo información limitada a través de 'resource.show'?
Anthony
1
@Anthony: resource.edites mostrar una Vista de edición, básicamente, el formulario para editar un recurso existente.
ryanwinchester
@fungku Eso es interesante ... entonces, ¿estás diciendo que resource.edit realmente devolvería HTML en lugar de JSON?
Anthony
2
@ Anthony En general, (y que yo sepa) sí. resource.edity resource.createson típicamente para una interfaz de usuario ... que representa una vista con formularios HTML. Esos formularios PUT / POST a resource.updatey resource.storerespectivamente. Si no está haciendo eso, simplemente puede ignorarlos y deshacerse de los métodos edit () y create () en su controlador.
ryanwinchester
3

Para el método de controlador de ruta tenemos que definir solo una ruta. En el método get o post tenemos que definir la ruta por separado.

Y el método de recursos se usa para crear múltiples rutas para manejar una variedad de acciones de Restful.

Aquí la documentación de Laravel sobre esto.

Ahmad Sharif
fuente