La semana pasada estuve platicando con uno de mis colaboradores sobre como estábamos avanzando en un proyecto que más adelante les estaré contando y nos dimos cuenta que se nos estaba formando un archivo de rutas muy grande (teníamos más de 40 rutas) y decidimos optimizarlas, así que el día de hoy el objetivo es que aprendas a como lo realizamos nosotros para que lo puedas aplicar en tus proyectos y hacerlos más mantenibles.

 Antecedentes

Siempre he sido de la idea de que siempre que se está enseñando algo se muestre el porque se hizo determinada cosa y en este caso, cómo fue que decidimos optimizar las rutas de Laravel.

Nuestra aplicación tiene un sistema de administración embebido dentro de la aplicación de los clientes y decimos solventar esto con permisos y roles, nos ha funcionado muy bien hasta el momento y el desarrollo es muy fácil.

Esto representa agregar múltiples middlewares dentro de las rutas.

Conforme ha estado evolucionando la aplicación, llegamos a un punto en donde mantener las rutas se ha vuelto un tema, es por eso que decidimos tomar un plan de acción para reducir la deuda técnica.

¿Por qué no lo hice desde el principio?

Es una interesante pregunta, de hecho, lo hice para no agregar complejidad desde el principio y tener todo perfectamente en un solo fichero, pero, eso no es todo, tampoco tenía muy claro los alcances del proyecto y por ende no sabía muy bien como podía ir avanzando.

Optimizando las rutas en Laravel

Es hora de la acción y de explicarte a detalle cómo fue que hice todo el proceso de optimización.

Rutas por defecto

routes/

  • api.php
  • web.php
  • channels.php
  • console.php

Estas rutas son las que vienen por defecto en Laravel y no están mal, pero conforme van creciendo las aplicaciones necesita ciertos ajustes como los que te voy a proponer a continuación.

routes/

  • api/
    • admin.php
    • user.php
    • support.php
  • web/
    • admin.php
    • user.php
    • general.php
    • public.php
  • channels.php
  • console.php

Solo se segmentaron los directorios api y web para poder separar las rutas según 2 tipos de usuarios (admin y user).

Edición de RouteServiceProvider.php

Ahora que modificamos las carpetas de las rutas que vienen por defecto, es necesario indicarle a Laravel que tome estos cambios, para eso editaremos el archivo /app/Providers/RouteServiceProvider.php

/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
     $this->mapApiRoutes();
     $this->mapAdminWebRoutes();
     $this->mapUserWebRoutes();
     $this->mapPublicRoutes();
     $this->mapWebRoutes();

}

Este método es el encargado de mapear todas las rutas de nuestra aplicación.

/**
    * Define the "web" routes for the application.
    *
    * These routes all receive session state, CSRF protection, etc.
    *
    * @return void
    */
   protected function mapWebRoutes()
   {
       Route::middleware('web')
           ->namespace($this->namespace)
           ->group(base_path('routes/web/general.php'));
   }

   protected function mapAdminWebRoutes()
   {
       Route::middleware(['web', 'auth', 'verified', '2fa', 'role:super-admin'])
           ->namespace($this->namespace)
           ->prefix('app')
           ->group(base_path('routes/web/admin.php'));
   }

   protected function mapUserWebRoutes()
   {
       Route::middleware(['web', 'auth', 'verified', '2fa'])
           ->namespace($this->namespace)
           ->prefix('app')
           ->group(base_path('routes/web/user.php'));
   }

   protected function mapPublicRoutes()
   {
       Route::middleware(['web', 'guest'])
           ->namespace($this->namespace)
           ->group(base_path('routes/web/public.php'));
   }


   /**
    * Define the "api" routes for the application.
    *
    * These routes are typically stateless.
    *
    * @return void
    */
   protected function mapApiRoutes()
   {
       Route::prefix('api')
           ->middleware('api')
           ->namespace($this->namespace)
           ->group(base_path('routes/api.php'));
   }

Estos métodos son los encargados de indicarle a Laravel en donde se encuentran nuestras rutas, asignarle un prefijo y un middleware.

¿Qué ganamos haciendo esto?

En el proyecto que estamos trabajando actualmente nos encontramos 3 desarrolladores colaborando en diferentes secciones de Laravel y esto nos ha permitido un ahorro de tiempo considerable en trabajar cada archivo separado y también hemos separado lógica y estructurado mejor las rutas.

Esto se traduce a una mayor mantenibilidad ya que todas las funciones están correctamente divididas.

Ahora, cada programador tiene asignado un archivo en el cual podrán trabajar directamente sin tener que estar actualizándolo a cada rato.

Conclusiones

Es importante que detectes como va avanzando tu aplicación, esto te permitirá conocer por donde hay que ir optimizando código, eliminando lineas innecesarias, reordenar carpetas, etc.

También, es bueno tener una visión lo más acertada posible de la aplicación para conocer sus alcances en algún futuro, esto nos permitirá ir reduciendo cuellos de botella y muchas, muchas horas de trabajo.