Rutas
Rutas Básicas
Las rutas más básicas de Laravel aceptan un URI y un cierre, proporcionando un método muy simple y expresivo de definir rutas y comportamientos sin complicados archivos de configuración de rutas:
Los archivos de ruta por defecto
Todas las rutas Laravel se definen en los archivos de ruta, que se encuentran en el directorio routes
. Estos archivos son cargados automáticamente por el App\Providers\RouteServiceProvider
de tu aplicación. El archivo routes/web.php
define las rutas que son para su interfaz web. A estas rutas se les asigna el grupo de middleware web
, que proporciona características como el estado de sesión y la protección CSRF. Las rutas en routes/api.php
no tienen estado y se les asigna el grupo de middleware api
.
Para la mayoría de las aplicaciones, usted comenzará definiendo rutas en su archivo routes/web.php
. Puede acceder a las rutas definidas en routes/web.php
introduciendo la URL de la ruta definida en su navegador. Por ejemplo, puede acceder a la siguiente ruta navegando a http://example.com/user
en su navegador:
Las rutas definidas en el archivo routes/api.php
están anidadas dentro de un grupo de rutas por el RouteServiceProvider
. Dentro de este grupo, el prefijo URI /api
se aplica automáticamente, por lo que no es necesario aplicarlo manualmente a cada ruta del archivo. Puedes modificar el prefijo y otras opciones del grupo de rutas modificando tu clase RouteServiceProvider
.
Métodos de router disponibles
El router permite registrar rutas que respondan a cualquier verbo HTTP:
A veces puede necesitar registrar una ruta que responda a múltiples verbos HTTP. Puede hacerlo utilizando el método match
. O incluso puedes registrar una ruta que responda a todos los verbos HTTP utilizando el método any
:
Inyección de dependencias
Protección CSRF
Redireccionar rutas
Si está definiendo una ruta que redirige a otro URI, puede utilizar el método Route::redirect
. Este método proporciona un atajo conveniente para que usted no tiene que definir una ruta completa o controlador para realizar una simple redirección:
Por defecto, Route::redirect
devuelve un código de estado 302
. Puede personalizar el código de estado utilizando el tercer parámetro opcional:
También puede utilizar el método Route::permanentRedirect
para devolver un código de estado 301
:
Rutas de Vista
Lista de rutas
El comando route:list
de Artisan puede proporcionar fácilmente una visión general de todas las rutas definidas por su aplicación:
Por defecto, el middleware de ruta que se asigna a cada ruta no se mostrará en la salida route:list
; sin embargo, puedes ordenar a Laravel que muestre el middleware de ruta añadiendo la opción -v
al comando:
También puede ordenar a Laravel que sólo muestre las rutas que comienzan con un URI determinado:
Además, puedes indicar a Laravel que oculte cualquier ruta definida por paquetes de terceros proporcionando la opción --except-vendor
al ejecutar el comando route:list
:
Del mismo modo, también puedes indicar a Laravel que sólo muestre las rutas definidas por paquetes de terceros proporcionando la opción --only-vendor
al ejecutar el comando route:list
:
Parámetros de ruta
Parámetros Requeridos
A veces necesitará capturar segmentos del URI dentro de su ruta. Por ejemplo, puede que necesite capturar el ID de un usuario de la URL. Puede hacerlo definiendo parámetros de ruta:
Puede definir tantos parámetros de ruta como requiera su ruta:
Los parámetros de ruta van siempre entre llaves {}
y deben estar formados por caracteres alfabéticos. Los guiones bajos (_
) también son aceptables en los nombres de parámetros de ruta. Los parámetros de ruta se inyectan en las retrollamadas/los controladores de ruta en función de su orden: los nombres de los argumentos de las retrollamadas/los controladores de ruta no importan.
Parámetros e inyección de dependencias
Si tu ruta tiene dependencias que quieres que el contenedor de servicios de Laravel inyecte automáticamente en el callback de tu ruta, debes listar los parámetros de tu ruta después de tus dependencias:
Parámetros opcionales
En ocasiones puede ser necesario especificar un parámetro de ruta que no siempre está presente en el URI. Puede hacerlo colocando una marca ?
después del nombre del parámetro. Asegúrese de dar a la variable correspondiente de la ruta un valor por defecto:
Restricciones con expresiones regulares
Puede restringir el formato de los parámetros de ruta utilizando el método where
en una instancia de ruta. El método where
acepta el nombre del parámetro y una expresión regular que define cómo se debe restringir el parámetro:
Para mayor comodidad, algunos patrones de expresiones regulares de uso común tienen métodos de ayuda que le permiten añadir rápidamente restricciones de patrones a sus rutas:
Si la solicitud entrante no coincide con las restricciones del patrón de ruta, se devolverá una respuesta HTTP 404.
Restricciones globales
Si desea que un parámetro de ruta esté siempre limitado por una expresión regular dada, puede utilizar el método pattern
. Debe definir estos patrones en el método boot
de su clase App\Providers\RouteServiceProvider
:
Una vez definido el patrón, se aplica automáticamente a todas las rutas que utilicen ese nombre de parámetro:
Slashes codificados
El componente de enrutamiento de Laravel permite que todos los caracteres excepto /
estén presentes en los valores de los parámetros de ruta. Debe permitir explícitamente que /
forme parte de su marcador de posición utilizando una expresión regular de condición where
:
Rutas con nombre
Las rutas con nombre permiten generar cómodamente URL o redirecciones para rutas específicas. Puede especificar un nombre para una ruta encadenando el método name
en la definición de la ruta:
También puede especificar nombres de ruta para las acciones del controlador:
Generación de URL para rutas con nombre
Una vez que hayas asignado un nombre a una ruta dada, puedes usar el nombre de la ruta cuando generes URLs o redirecciones a través de las funciones de ayuda route
y redirect
de Laravel:
Si la ruta definida contiene parámetros, puede pasarlos como segundo argumento a la función route
. Los parámetros dados se insertarán automáticamente en la URL generada en sus posiciones correctas:
Si pasa parámetros adicionales en la matriz, esos pares clave/valor se añadirán automáticamente a la cadena de consulta de la URL generada:
Inspeccionando la ruta actual
Si desea determinar si la petición actual ha sido enrutada a una ruta con nombre, puede utilizar el método named
en una instancia de Route. Por ejemplo, puede comprobar el nombre de la ruta actual desde un middleware de ruta:
Grupos de rutas
Los grupos de rutas permiten compartir atributos de ruta, como el middleware, entre un gran número de rutas sin necesidad de definir esos atributos en cada ruta individual.
Los grupos anidados intentan "fusionar" inteligentemente los atributos con su grupo padre. Las condiciones de middleware y where
se fusionan mientras que los nombres y prefijos se añaden. Los delimitadores de espacios de nombres y las barras oblicuas de los prefijos URI se añaden automáticamente cuando procede.
Middleware
Controladores
Enrutamiento de subdominios
Los grupos de rutas también pueden utilizarse para gestionar el enrutamiento de subdominios. A los subdominios se les pueden asignar parámetros de ruta igual que a los URI de ruta, lo que permite capturar una parte del subdominio para utilizarla en la ruta o el controlador. El subdominio puede especificarse llamando al método domain
antes de definir el grupo:
Prefijos de rutas
El método prefix
se puede utilizar para prefijar cada ruta del grupo con un URI determinado. Por ejemplo, es posible que desee prefijar todos los URI de ruta dentro del grupo con admin
:
Prefijos de nombre de ruta
El método name
se puede utilizar para prefijar cada nombre de ruta en el grupo con una cadena dada. Por ejemplo, puede prefijar los nombres de todas las rutas del grupo con admin
. La cadena dada se antepone al nombre de la ruta exactamente como se especifica, por lo que nos aseguraremos de proporcionar el carácter .
al final del prefijo:
Vinculación del modelo de ruta (Route Model Binding)
Cuando se inyecta un ID de modelo a una ruta o acción de controlador, a menudo se consulta la base de datos para recuperar el modelo que corresponde a ese ID. Laravel route model binding proporciona una forma conveniente de inyectar automáticamente las instancias del modelo directamente en tus rutas. Por ejemplo, en lugar de inyectar el ID de un usuario, puedes inyectar toda la instancia del modelo User
que coincida con el ID dado.
Vinculación implícita
Laravel resuelve automáticamente los modelos Eloquent definidos en rutas o acciones de controlador cuyos nombres de variables de tipo coinciden con un nombre de segmento de ruta. Por ejemplo:
Dado que la variable $user
es del tipo App\Models\User
del modelo Eloquent y el nombre de la variable coincide con el segmento URI {user}
, Laravel inyectará automáticamente la instancia del modelo que tenga un ID que coincida con el valor correspondiente del URI de la petición. Si no se encuentra una instancia de modelo coincidente en la base de datos, se generará automáticamente una respuesta HTTP 404.
Por supuesto, la vinculación implícita también es posible cuando se utilizan métodos de controlador. De nuevo, observe que el segmento URI {user}
coincide con la variable $user
del controlador, que contiene una sugerencia de tipo App\Models\User
:
Modelos suaves eliminados (Soft Deleted Models)
Personalización de la clave
A veces puede que desee resolver modelos Eloquent utilizando una columna distinta de id
. Para ello, puede especificar la columna en la definición del parámetro de ruta:
Si deseas que el enlace del modelo utilice siempre una columna de la base de datos distinta de id
al recuperar una clase de modelo determinada, puedes anular el método getRouteKeyName
del modelo de Eloquent:
Claves personalizadas y ámbito
Cuando se vinculan implícitamente varios modelos Eloquent en una única definición de ruta, es posible que desee delimitar el alcance del segundo modelo Eloquent para que sea hijo del modelo Eloquent anterior. Por ejemplo, considere esta definición de ruta que recupera una entrada de blog por slug para un usuario específico:
Cuando se utiliza un enlace implícito con clave personalizada como parámetro de ruta anidado, Laravel delimitará automáticamente la consulta para recuperar el modelo anidado por su padre utilizando convenciones para adivinar el nombre de la relación en el padre. En este caso, se asumirá que el modelo User
tiene una relación llamada posts
(la forma plural del nombre del parámetro de ruta) que se puede utilizar para recuperar el modelo Post
.
Si lo deseas, puedes indicar a Laravel que haga scope de los bindings "hijos" incluso cuando no se proporcione una clave personalizada. Para ello, puede invocar el método scopeBindings
al definir su ruta:
También puede indicar a todo un grupo de definiciones de ruta que utilicen enlaces de ámbito:
Del mismo modo, puedes indicar explícitamente a Laravel que no haga scope de los bindings invocando el método withoutScopedBindings
:
Personalización del comportamiento del modelo ausente
Normalmente, se generará una respuesta HTTP 404 si no se encuentra un modelo vinculado implícitamente. Sin embargo, puede personalizar este comportamiento llamando al método missing
cuando defina su ruta. El método missing
acepta un cierre que será invocado si no se encuentra un modelo vinculado implícitamente:
Vinculación Enum implícita
Puedes definir una ruta que sólo será invocada si el segmento de ruta {category}
es fruits
o people
. De lo contrario, Laravel devolverá una respuesta HTTP 404:
Vinculación explícita
No es necesario utilizar la resolución de modelos implícita y basada en convenciones de Laravel para utilizar la vinculación de modelos. También puede definir explícitamente cómo los parámetros de ruta se corresponden con los modelos. Para registrar una vinculación explícita, utiliza el método model
del enrutador para especificar la clase de un parámetro determinado. Debes definir tus enlaces explícitos al principio del método boot
de tu clase RouteServiceProvider
:
A continuación, defina una ruta que contenga un parámetro {user}
:
Dado que hemos vinculado todos los parámetros {user}
al modelo App\Models\User
, una instancia de esa clase será inyectada en la ruta. Así, por ejemplo, una solicitud a users/1
inyectará la instancia User
de la base de datos que tiene un ID de 1
.
Si no se encuentra una instancia de modelo coincidente en la base de datos, se generará automáticamente una respuesta HTTP 404.
Personalización de la lógica de resolución
Si desea definir su propia lógica de resolución de enlace de modelo, puede utilizar el método Route::bind
. El cierre que pases al método bind
recibirá el valor del segmento URI y debería devolver la instancia de la clase que debería ser inyectada en la ruta. De nuevo, esta personalización debería tener lugar en el método boot
del RouteServiceProvider
de tu aplicación:
Alternativamente, puedes anular el método resolveRouteBinding
en tu modelo Eloquent. Este método recibirá el valor del segmento URI y devolverá la instancia de la clase que debe inyectarse en la ruta:
Si una ruta utiliza implicit binding scoping, se utilizará el método resolveChildRouteBinding
para resolver el enlace hijo del modelo padre:
Rutas fallback
Usando el método Route::fallback
, puede definir una ruta que se ejecutará cuando ninguna otra ruta coincida con la petición entrante. Normalmente, las peticiones no gestionadas mostrarán automáticamente una página "404" a través del gestor de excepciones de tu aplicación. Sin embargo, dado que normalmente definirías la ruta fallback
dentro de tu archivo routes/web.php
, todo el middleware en el grupo de middleware web
se aplicará a la ruta. Eres libre de añadir middleware adicional a esta ruta según sea necesario:
Limite de rango
Definición de los limitadores de rango
Laravel incluye potentes y personalizables servicios de limitación de tasa que puedes utilizar para restringir la cantidad de tráfico de una ruta o grupo de rutas determinado. Para empezar, debes definir las configuraciones del limitador de tasa que satisfagan las necesidades de tu aplicación. Típicamente, esto debería hacerse dentro del método configureRateLimiting
de la clase App\Providers\RouteServiceProvider
de su aplicación, que ya incluye una definición de limitador de tasa que se aplica a las rutas en el archivo routes/api.php
de su aplicación:
Los limitadores de tráfico se definen utilizando el método for
de la facade RateLimiter
. El método for
acepta un nombre de limitador de tasa y un closure que devuelve la configuración de límite que debería aplicarse a las rutas asignadas al limitador de tráfico. La configuración de límites son instancias de la clase Illuminate\Cache\RateLimiting\Limit
. Esta clase contiene útiles métodos "constructores" para que pueda definir rápidamente su límite. El nombre del limitador de tráfico puede ser cualquier cadena que desee:
Si la petición entrante excede el límite de tráfico especificado, Laravel devolverá automáticamente una respuesta con un código de estado HTTP 429. Si desea definir su propia respuesta que debe ser devuelto por un límite de velocidad, puede utilizar el método response
:
Dado que los callbacks del limitador de tráfico reciben la instancia de la petición HTTP entrante, puede construir el límite de tráfico apropiado dinámicamente basándose en la petición entrante o en el usuario autenticado:
Segmentación de límites de tráfico
A veces es posible que desee segmentar los límites de velocidad por algún valor arbitrario. Por ejemplo, puede que desee permitir a los usuarios acceder a una ruta dada 100 veces por minuto por dirección IP. Para ello, puede utilizar el método by
cuando construya su límite de velocidad:
Para ilustrar esta función con otro ejemplo, podemos limitar el acceso a la ruta a 100 veces por minuto por ID de usuario autenticado o a 10 veces por minuto por dirección IP para los invitados:
Múltiples límites de tráfico
Si es necesario, puede devolver una matriz de límites de tráfico para una configuración de limitador de tráfico determinada. Cada limitador de tráfico será evaluado para la ruta basándose en el orden en que están colocados dentro del array:
Conexión de limitadores de tráfico a rutas
Limitación con Redis
Normalmente, el middleware throttle
se asigna a la clase Illuminate\Routing\Middleware\ThrottleRequests
. Esta asignación se define en el núcleo HTTP de tu aplicación (App\Http\Kernel
). Sin embargo, si está utilizando Redis como controlador de caché de su aplicación, es posible que desee cambiar esta asignación para utilizar la clase Illuminate\Routing\Middleware\ThrottleRequestsWithRedis
. Esta clase es más eficiente en la gestión de la limitación de velocidad utilizando Redis:
Suplantación del método de formulario
Los formularios HTML no soportan las acciones PUT
, PATCH
o DELETE
. Por tanto, cuando definas rutas PUT
, PATCH
, o DELETE
que sean llamadas desde un formulario HTML, necesitarás añadir un campo oculto _method
al formulario. El valor enviado con el campo _method
se utilizará como método de petición HTTP:
Accediendo a la ruta actual
Puede utilizar los métodos current
, currentRouteName
y currentRouteAction
de la fachada Route
para acceder a la información sobre la ruta que gestiona la solicitud entrante:
Intercambio de Recursos de Origen Cruzado (CORS)
Caché de rutas
Cuando despliegues tu aplicación en producción, deberías aprovechar la caché de rutas de Laravel. El uso de la caché de rutas disminuirá drásticamente la cantidad de tiempo que se tarda en registrar todas las rutas de tu aplicación. Para generar una caché de rutas, ejecuta el comando Artisan route:cache
:
Después de ejecutar este comando, su archivo de rutas en caché se cargará en cada petición. Recuerda, si añades nuevas rutas necesitarás generar una nueva caché de rutas. Por ello, sólo deberías ejecutar el comando route:cache
durante el despliegue de tu proyecto.
Puedes usar el comando route:clear
para borrar la caché de rutas:
Última actualización
¿Te fue útil?