Continuación de la explicación de las rutas en Laravel 5.7
Ya vimos la introducción a las rutas en Laravel, en donde exponemos las cosas más importantes y comunes. Este post es la continuación del anterior, y ahora vamos a ver:
- Prefijos en las rutas para agruparlas
- Ruta de fallback cuando no se encuentra alguna ruta que coincida con la petición, algo así como manejar un error 404
- Límite de tasa para limitar las peticiones, usando el middleware de throttle
- Generación de los verbos HTTP dentro de formularios, por ejemplo PUT, DELETE o esas cosas
Son cosas un poco más avanzadas pero nada imposible de entender.
Te recomiendo leer el post anterior, pues aquí explicaré suponiendo que ya lo has leído.
Prefijos en las rutas
Dependiendo de nuestra aplicación puede que necesitemos prefijar o añadir una cadena constante al inicio de cada ruta. Por ejemplo, si hay algunas rutas que tienen que ver con el administrador, así:
- administrador/escritorio
- administrador/ajustes
- administrador/cuenta
- administrador/factura/1
Tendríamos que escribir todas las rutas por separado. Pero Laravel provee una manera de prefijarlas y responder a cada ruta a partir de ese prefijo llamando a Route::prefix()
y pasándole un argumento que es el prefijo.
Veamos el código de ejemplo:
<?php
Route::prefix("administrador")->group(function(){
// Aquí llamar a Route::método como lo solíamos hacer
// podemos pasar parámetros, poner nombres, expresiones
// regulares y todo eso
Route::get("/", function(){
return "Yo respondo a administrador/";
});
Route::get("/escritorio", function(){
return "Yo respondo a administrador/escritorio";
});
Route::get("/ajustes", function(){
return "Yo respondo a administrador/ajustes";
});
Route::get("/cuenta", function(){
return "Yo respondo a administrador/cuenta";
});
Route::get("/factura/{id}", function($id){
return "Yo respondo a administrador/factura y puedo ver que el id es $id";
});
});
Ahora en lugar de escribir el prefijo manualmente, indicamos el mismo al llamar a prefix
. Luego de eso creamos un grupo de rutas, pasamos una función y dentro de ella podemos trabajar con las rutas de la manera en la que estamos acostumbrados.
De esa manera podemos agrupar con un prefijo en común. Y ya lo dije en los comentarios, se puede hacer lo mismo que se hace fuera del grupo: pasar parámetros, usar métodos como POST o GET y expresiones regulares.
Nota: también podemos usar prefijos con barras, es decir, en lugar de usar el prefijo administrador podríamos usar administrador/panel como prefijo. En resumen, usar barras inclinadas en el prefijo no genera errores.
La ruta de fallback cuando no se resuelve ninguna ruta
Con la ruta de fallback podemos personalizar o cambiar la forma en la que se maneja un error 404 en Laravel. Normalmente aparece una bonita página de not found, pero podemos manejarla a nuestro antojo.
Para personalizar el comportamiento de cuando no se encuentra o resuelve ninguna ruta, llamamos a Route::fallback
y le pasamos una función que se encargará de mostrar un mensaje de error o redirigir, eso depende de nuestra app.
<?php # Línea para que gist marque la sintaxis
Route::fallback(function () {
// Pequeña nota: recuerda que lo que va después de un return no
// se ejecuta, si vas a hacer algunas cosas hazlas antes del return.
// En este caso pongo muchos return para ejemplificar pero la función
// se termina en el primer return que encuentre; tiene que ver con
// fundamentos de programación pero no está de más explicarlo
# Regresar una simple cadena
return "No encontré la página que buscabas";
# Renderizar una vista
return view("nombre_de_la_vista");
# Redireccionar
return redirect("/");
# Redireccionar con datos
return redirect("/")->with("mensaje", "Hola mundo soy un mensaje");
# Y recuerda que puedes hacer cualquier cosa como loguear que no
# se encontró una página, enviar un correo o lo que sea
});
Dentro de la función se puede hacer cualquier cosa aparte de manejar la petición. Por ejemplo, podrías loguear el error.
Nota: la documentación oficial dice que esta debería ser la última ruta en nuestro archivo de rutas; es decir, hay que ponerla al final.
Límite de tasa o rate limiting en las rutas
Esta característica es algo que se agradece mucho. Permite poner un límite de peticiones a las rutas, viene bien cuando tenemos una API (ya que podríamos limitar los accesos por usuario) pero igualmente podría servir para miles de cosas más.
Por cierto, este límite de tasa ya lo había explicado hace algún tiempo, te invito a leer la entrada.
Pero bueno, veamos cómo limitar las peticiones cada cierto tiempo, para que el usuario pueda solicitar los recursos de manera controlada.
Vemos que el middleware de throttle recibe dos argumentos: el número de intentos y el número de minutos en los que se puede acceder dentro del número de intentos.
En el primer ejemplo el usuario puede ver la página 2 veces por minuto, en el segundo 100 veces por minuto y en el último se usa la configuración por defecto.
Por cierto, podríamos agrupar las rutas de modo que el throttle se aplique a cada una de las rutas.
<?php# Línea para que gist marque la sintaxis
Route::middleware("throttle:2,1")->group(function () {
Route::get("/limitada", function () {
return "Hola usuario. Solamente puedes verme 2 veces por minuto";
});
// Aquí abajo podrías agregar rutas que igualmente serán limitadas
// con el throttle de arriba
});
Route::middleware("throttle:100,2")->group(function () {
Route::get("/menos_limitada", function () {
return "Hola usuario. Puedes verme 100 veces cada 2 minutos";
});
// Aquí abajo podrías agregar rutas que igualmente serán limitadas
// con el throttle de arriba
});
Route::middleware("throttle")->group(function () {
Route::get("/limitada_defecto", function () {
return "Hola usuario. Puedes verme 60 veces cada 1 minuto,
lo cual es la configuración por defecto";
});
// Aquí abajo podrías agregar rutas que igualmente serán limitadas
// con el throttle de arriba
});
Generación de verbos HTTP dentro de formularios
Para terminar con esta parte veamos un complemento a las rutas y es la generación de verbos HTTP dentro de los formularios.
Como sabemos, los formularios solamente tienen 2 métodos: GET y POST. Si estructuramos nuestras rutas de manera que usan otros verbos como PUT o DELETE, no podremos llamarlas con un simple formulario.
Afortunadamente, Laravel provee una manera de definir el método dentro de los formularios con un pequeño campo llamado _method
, sí, con todo y guion bajo. Dentro del value
del input
ponemos el método que usa; Laravel verá el método y llamará a la ruta necesaria.
Para definir el método/verbo HTTP dentro del formulario en las vistas con Blade, hacemos esto:
<form action="la_ruta_de_proceso" method="POST">
<!-- Aquí el método como DELETE, PUT, etcétera -->
@method('DELETE')
</form>
Es importante mencionar que el método del formulario debe seguir siendo POST, ya que así los datos viajarán en el cuerpo de la petición.
Si tú no usas Blade o no quieres usarlo, genera el código tú mismo poniendo un input
de tipo hidden
con el nombre de _method
y en el valor coloca el verbo HTTP.
<form method="POST" action="aquí_la_accion">
<!-- En value pon el verbo HTTP -->
<input type="hidden" name="_method" value="delete">
</form>
Cuando ya tengamos nuestros formularios y rutas configuradas, ahora sí se podrán llamar a otros verbos HTTP desde los formularios.
Conclusión
Con esta segunda parte ya casi sabemos todo lo necesario para trabajar con las rutas en Laravel 5.7. Más adelante traeré tutoriales sobre otros componentes como vistas, generación de formularios o interacción con bases de datos.
Mientras tanto te invito a seguirme en mis redes sociales y también a leer más sobre PHP o Laravel.
Como referencia dejo este enlace a la documentación oficial.