IronWoods.es

Desarrollo web

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.

vista de panel de administración de ecommerce
Panel de administración con los botones de un CRUD

Ejemplo de grupo de rutas de un CRUD

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     |
+----------+------------------------------------+------------------------------------------------------+
Notas:

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:

  • La acción no está indicada explícitamente en la ruta, depende del verbo HTTP.
  • En caso de que la ruta tenga la acción (activar / desactivar) esta sigue a la ID del registro al que afecta (podemos verlo en el caso de "edit").

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)