Throttle en Laravel

Rutas en Laravel parte 2: prefijos, fallback, límite de tasa y formularios

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.

Agrupando rutas en Laravel
Agrupando rutas en Laravel

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.

Throttle en Laravel
Throttle en Laravel

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *