banner-route-groups-laravel

Laravel nos proporciona una manera de agrupar las rutas de un proyecto: el método Route::group() que nos  permite simplificar nuestro archivo de rutas, organizándolas en grupos que comparten elementos en común como pueden ser middleware, namespaces, sub-dominios, entre otros; que de otra manera, resultaría engorroso asignar o definir para cada ruta. En este tutorial conoceremos las distintas opciones que tenemos disponibles con el método Route::group().

Para trabajar con este método ubicamos en el primer argumento un array que contendrá los atributos que comparten las rutas que están dentro de él. Pueden darse varios casos:

Agrupar rutas que comparten un Middleware

Si queremos asignar un middleware a múltiples rutas podemos hacer lo siguiente:

Route::group(['middleware' => 'auth'], function () {
    //
});

donde dentro se colocaría todas las rutas del proyecto que queremos que estén regidas por dicho middleware. En caso de ser varios middleware sería de la siguiente forma:

Route::group(['middleware' => ['web', 'admin']], function () {
    //
});

Agrupar rutas que pertenecen a controladores que están bajo un mismo namespace

Por defecto a través de /app/Providers/RouteServiceProvider.php, Laravel establece  el namespace aplicado a las rutas de controladores del archivo /app/Http/routes.php.

Pero si por ejemplo, tenemos un controlador llamado PostController con un namespace diferente:

<?php

namespace App\Http\Controllers\Admin;

class PostController extends Controller
{

}

Las rutas de ese controlador las escribiríamos así:

Route::get('admin/posts', 'Admin\PostController@index');
Route::get('admin/posts/create', 'Admin\PostController@create');
Route::post('admin/posts', 'Admin\PostController@store');

Para organizarlas con el método Route::group() podemos usar el atributo namespace con el que le indicamos a Laravel que el namespace del controlador ya no es simplemente App\Http\Controllers  sino  App\Http\Controllers\Admin de la siguiente manera:

Route::group(['namespace' => 'Admin'], function() {
    // Rutas de los controladores dentro del Namespace "App\Http\Controllers\Admin"
    Route::get('admin/posts', 'PostController@index');
    Route::get('admin/posts/create', 'PostController@create');
    Route::post('admin/posts', 'PostController@store');
});

Ahorrándonos tener que agregar el namespace del controlador en cada ruta.

Agrupar rutas con un mismo prefijo

Cuando algunas rutas comparten una estructura de URL similar como:

http://styde.net/admin/posts 
http://styde.net/admin/account
http://styde.net/admin/dashboard

Donde tienen un prefijo en común /admin, podemos utilizar el atributo prefix para organizar nuestro grupo de rutas de esta manera:

Route::group(['prefix' => 'admin'], function() {
    Route::get('posts', 'PostController@index');
    Route::get('accounts', 'AccountController@index');
    Route::post('dashboard', 'DashboardController@index')
});

Esto es muy útil para evitar la repetición de prefijos en las rutas y además, de facilitarnos la tarea al momento de hacer un cambio en la estructura de la URL, pues tan solo modificaríamos el atributo prefix y no en cada una de las rutas.

Agrupar rutas por sub-dominio

También puede darse el caso que una aplicación trabaje con diferentes sub-dominios, por ejemplo:

http://styde.dev/posts

http://teach.styde.dev/tickets

http://api.styde.dev/ruta

Para organizar las rutas con el método Route::group() podemos hacer lo siguiente:

Route::group(['domain' => 'styde.dev'], function () {
    Route::get('posts', function () {
        //
    });
});

Route::group(['domain' => 'teach.styde.dev'], function () {
    Route::get('tickets', function () {
        //
    });
});

Route::group(['domain' => 'api.styde.dev'], function () {
    Route::get('ruta', function () {
        //
    });
});

Además, se puedes capturar una porción del nombre del sub-dominio para usarlo como parámetro utilizando llaves para especificarlo:

Route::group(['domain' => '{user}.styde.dev'], function () {
    Route::get('profile/{id}', function ($user, $id) {
        //
    });
});

Para que los sub-dominios funcionen correctamente el servidor web debe estar configurado para servir las peticiones desde cada sub-dominio a Laravel.

Todos estos atributos los podemos usar combinados en los proyectos, lo que nos permitiría una mejor organización de las rutas, pues a medida que el tamaño del proyecto crece se hace necesario tener un mayor control de ellas. Así que trabajar con este método junto con la estrategia planteada en Cómo organizar las rutas de tus proyectos de Laravel puede hacer que mejores considerablemente el archivo /app/Http/routes.php de tu proyecto.

Espero les sea de utilidad y no olvides compartir en las redes sociales.

Material relacionado

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Cómo organizar las rutas de tus proyectos de Laravel Lección siguiente Traits para el desarrollo de pruebas de integración en Laravel