13.x, y la implementación del framework es la última versión, v13.34.0.
loadRoutesFrom solo carga el archivo
ServiceProvider::loadRoutesFrom() no carga el archivo de rutas si la aplicación implementa CachesRoutes y routesAreCached() devuelve verdadero. En cualquier otro caso, hace require del archivo indicado.
Este método no añade por sí mismo prefijos de URI ni de nombre de ruta, espacios de nombres de controladores ni middleware. Tampoco publica archivos ni añade rutas a una caché existente.
El diagrama asume una aplicación Laravel estándar. No existe una caché exclusiva para el paquete: las rutas del paquete se incluyen en la caché de rutas de toda la aplicación.
Separar la configuración del registro
En el siguiente ejemplo se crea un endpoint público que indica si el paquete puede responder. Se asume que el PSR-4 de Composer asignaAcme\Courier\ a src/ y que el provider se registra mediante detección automática o de forma manual.
config/courier.php
register() y la carga de rutas en boot(). No conviertas en DeferrableProvider un provider que registra rutas HTTP, porque dejaría de estar garantizado que el provider arranque en el momento en que se necesitan las rutas.
src/CourierServiceProvider.php
routes/web.php
src/Http/Controllers/StatusController.php
/acme-courier/status y el nombre de la ruta es acme-courier.status. Si generas la URL con route('acme-courier.status'), el código que la llama puede seguir usando el mismo nombre de ruta aunque cambie el prefijo de la URI. El name() del grupo concatena la cadena tal cual, así que incluye también el . final.
web no sustituye a la autenticación ni a la autorización. Este ejemplo es un endpoint público que no contiene información confidencial. Para los endpoints que devuelven datos del usuario, añade por separado el middleware de autenticación y la autorización que requiera la especificación.Evitar por separado los conflictos de URI y de nombre de ruta
El prefijo de la URI y el prefijo del nombre de ruta son mecanismos distintos. Añadir solo uno de ellos no evita los conflictos del otro.AbstractRouteCollection lanza una LogicException al construir la colección de rutas para la caché si otra ruta tiene el mismo nombre. Que “se haya podido generar la URL en un arranque normal” no garantiza que las rutas se puedan cachear. Incluso dos rutas con URI distintas causan problemas si comparten nombre.
No conviertas en mecanismo de extensión del paquete la sobrescritura de las rutas de la aplicación según el orden de registro. Si hace falta, ofrece una opción de configuración para desactivar las rutas y un servicio que el usuario pueda invocar desde sus propias rutas.
La configuración del momento de crear la caché queda en la definición de rutas
RouteCacheCommand ejecuta primero route:clear, arranca una nueva aplicación y recopila las rutas. Después prepara esas rutas para que se puedan serializar y escribe el resultado compilado en el archivo de caché.
Como en ese momento también se carga el archivo de rutas del paquete, el prefijo y el hecho de registrar o no las rutas se deciden con la configuración vigente al crear la caché. En los arranques posteriores, loadRoutesFrom() no carga el archivo y se usan las rutas cacheadas.
No registres rutas en función de condiciones que cambian en cada petición, como el usuario o el tenant. Esas condiciones se evalúan en el entorno CLI en el momento de crear la caché. Registra las rutas con una configuración estable y decide si se permite el acceso mediante middleware o autorización dentro del controlador.
En el despliegue, fija primero la configuración
Una vez actualizados el código y la configuración, si se usa la caché de configuración, regenera las cachés en el siguiente orden. Incorpóralo al proceso de despliegue de la aplicación que usa el paquete.route:cache mientras queda una caché de configuración antigua, las rutas también se generan con la configuración antigua. Volver a ejecutar solo config:cache no actualiza la caché de rutas. Con -vv también puedes comprobar el contenido de los grupos de middleware.
Si durante el desarrollo quieres comprobar el funcionamiento sin caché, limpia ambas según sea necesario.
Combinaciones que comprobar antes de publicar una versión
Además de las pruebas del paquete, comprueba las siguientes combinaciones en una aplicación Laravel 13 que lo use. No te limites al registro de rutas en memoria: incluye también el camino en el que Artisan arranca una nueva aplicación.- Sin caché,
/acme-courier/statusresponde y el nombre de ruta y el middleware son los esperados. route:cachese ejecuta correctamente y, en un nuevo arranque, responde con la misma URI y el mismo nombre de ruta.- Al cambiar el prefijo y regenerar la caché, responde la nueva URI y desaparece la ruta del paquete en la URI anterior.
- Al desactivar las rutas y regenerar la caché, la ruta no aparece en
route:list --name=acme-courier. - No hay conflictos de URI ni de nombre de ruta con la aplicación ni con otros paquetes.
Páginas relacionadas
Enrutamiento
Repasa los fundamentos de los grupos de rutas, las rutas con nombre y su listado.
Fusión y caché de la configuración de paquetes
Repasa el procedimiento de actualización teniendo en cuenta la configuración publicada y la caché de configuración.
Service providers diferidos
Repasa por qué no conviene diferir un provider que registra rutas.
Gestión de la compatibilidad de versiones de paquetes
Vincula los cambios en la API pública con la política de versiones y la verificación continua.
Fuentes primarias consultadas
- Documentación oficial de Laravel: rutas de paquetes
- Documentación oficial de Laravel: enrutamiento
- ServiceProvider: implementación de loadRoutesFrom
- RouteServiceProvider: carga de la caché
- RouteCacheCommand: recopilación y guardado en una nueva aplicación
- AbstractRouteCollection: detección de nombres de ruta duplicados