Blog / Laravel / Grupo de rutas para un CRUD en Laravel
Una aplicación suele tener varios CRUDs, que tienen o deberían tener una serie de estructuras comunes, como los grupos de rutas.

Una aplicación suele tener varios CRUDs, que tienen o deberían tener una serie de estructuras comunes, como los grupos de rutas.
La "Página de administración Shop / Items", listado de items de la tienda, se cargará usando la primera ruta de la lista.
Un botón permite crear nuevos items (ruta 'create-item').
Cada uno de los items del listado tiene los siguientes botones: "activar / desactivar", "editar", "eliminar" y "ver", asociados al resto de las rutas.
Route::get('private/shop/items', 'Shop\PrivateShopController@index')
->name('show-items');
Route::put('private/shop/items/activate/{id}', 'Shop\ItemsController@activate')
->name('activate-item');
Route::put('private/shop/items/deactivate/{id}', 'Shop\ItemsController@deactivate')
->name('deactivate-item');
Route::delete('private/shop/items/destroy/{id}', 'Shop\ItemsController@destroy')
->name('destroy-item');
Route::get('private/shop/items/edit/{id}', 'Shop\ItemsController@edit')
->name('edit-item');
Route::get('private/shop/items/create', 'Shop\ItemsController@create')
->name('create-item');
Route::get('private/shop/items/show/{id}', 'Shop\ItemsController@show')
->name('show-item');
Route::post('private/shop/items/store', 'Shop\ItemsController@store')
->name('store-item');
Route::put('private/shop/items/update/{id}', 'Shop\ItemsController@update')
->name('update-item');
Si listamos las rutas contenido
php artisan route:list --path=items --compact
tenemos:
+----------+------------------------------------+------------------------------------------------------+
| Method | URI | Action |
+----------+------------------------------------+------------------------------------------------------+
| PUT | private/shop/items/activate/{id} | App\Http\Controllers\Shop\ItemsController@activate |
| GET|HEAD | private/shop/items/create/{id} | App\Http\Controllers\Shop\ItemsController@create |
| PUT | private/shop/items/deactivate/{id} | App\Http\Controllers\Shop\ItemsController@deactivate |
| DELETE | private/shop/items/destroy/{id} | App\Http\Controllers\Shop\ItemsController@destroy |
| GET|HEAD | private/shop/items/edit/{id} | App\Http\Controllers\Shop\ItemsController@edit |
| GET|HEAD | private/shop/items/show/{id} | App\Http\Controllers\Shop\ItemsController@show |
| POST | private/shop/items/store | App\Http\Controllers\Shop\ItemsController@store |
| PUT | private/shop/items/update/{id} | App\Http\Controllers\Shop\ItemsController@update |
+----------+------------------------------------+------------------------------------------------------+
Las acciones activar / desactivar no son parte de un CRUD básico, pero si bastante habituales cuando creamos contenidos: páginas, entradas, productos...
Las rutas anteriores, indican la acción, por lo que no siguen la convención de un CRUD Laravel (tampoco en el nombrado).
Un grupo de rutas para CRUD de Laravel puede ser generado automáticamente añadiendo en el fichero de rutas:
Route::resource('shop\items', 'Shop\ItemsController');
.
Para generar nuestro grupo de rutas, siguiente la convención de Laravel, y simplificando el código, podemos agrupar las rutas y usar resource:
Route::namespace('Shop')
->prefix('private/shop')
->group(function ()
{
Route::put('items/{id}/activate', 'ItemsController@activate')
->name('items.activate');
Route::put('items/{id}/deactivate', 'ItemsController@deactivate')
->name('items.deactivate');
Route::resource('items', 'ItemsController');
});
Si listamos las rutas contenido
php artisan route:list --path=items --compact
tenemos:
+-----------+------------------------------------+------------------------------------------------------+
| Method | URI | Action |
+-----------+------------------------------------+------------------------------------------------------+
| GET|HEAD | private/shop/items | App\Http\Controllers\Shop\ItemsController@index |
| POST | private/shop/items | App\Http\Controllers\Shop\ItemsController@store |
| GET|HEAD | private/shop/items/create | App\Http\Controllers\Shop\ItemsController@create |
| PUT | private/shop/items/{id}/activate | App\Http\Controllers\Shop\ItemsController@activate |
| PUT | private/shop/items/{id}/deactivate | App\Http\Controllers\Shop\ItemsController@deactivate |
| GET|HEAD | private/shop/items/{item} | App\Http\Controllers\Shop\ItemsController@show |
| PUT|PATCH | private/shop/items/{item} | App\Http\Controllers\Shop\ItemsController@update |
| DELETE | private/shop/items/{item} | App\Http\Controllers\Shop\ItemsController@destroy |
| GET|HEAD | private/shop/items/{item}/edit | App\Http\Controllers\Shop\ItemsController@edit |
+-----------+------------------------------------+------------------------------------------------------+
donde item
sería el Id del item.
Las rutas de Laravel tienen varias diferencias con respecto al primer grupo:
Podemos crear las rutas del CRUD con resource pero no alguna de ellas, por ejemplo, para no usar las rutas edit y update:
Route::resource('shop\items', 'Shop\ItemsController')
->except([
'edit',
'update',
]);
04-10-2020 (actualizado 15-02-2021)