DEV Community

Nahuel Segovia
Nahuel Segovia

Posted on

Laravel Router 2

Limitar la cantidad de peticiones hacia una ruta, o rate limits:

Primero nos dirigimos a RouteSerViceProvider.php y buscamos el método configureRateLimiting()

Y adentro de el vamos a definir nuestro middleware:

RateLimiter::for('dos', function(Request $request){
  return Limit::perMinute(2);
});
Enter fullscreen mode Exit fullscreen mode

Lo que hacemos es llamar a la clase RateLimiter y con el método for le especificamos el nombre del middleware, a continuación creamos una función anónima y dentro de ella limitamos la cantidad de peticiones con la clase Limit, esta contiene varios métodos estáticos para limitar la cantidad de peticiones, la mas usada es perMinute. También podemos generar nuestro propio mensaje para cuando se superen la cantidad de peticiones configuradas:

RateLimiter::for('tres', function(Request $request){
  return Limit::perMinute(3)->response(function(){
    return response('Excedió la cantidad de consultas', 429);
   });
});
Enter fullscreen mode Exit fullscreen mode

Ahora solo tenemos que ir a nuestras rutas y pasar como middleware nuestra configuración de esta manera:

Route::get('/tres', function(){
    return view('welcome');
})->middleware('throttle:tres');
Enter fullscreen mode Exit fullscreen mode

Este es el resultado:

Alt Text

Route Model Binding

Route Model Binding es una forma de vincular el modelo con una o varias rutas y que estas puedan hacer consultas de manera automática. Anteriormente cuando queríamos enviar datos desde el modelo hacia la vista teníamos que llamar al modelo desde el controlador y retornarlo ahí mismo.

Pero con esta forma de hacerlo vamos a ahorrarnos mucho código, además hay dos formas de hacerlo:

Forma explícita:

Es básicamente guardar el modelo en una variable en la función anónima que le pasamos a la ruta, como dato importante; para que esto funcione al parámetro de la ruta le tenemos que poner el mismo nombre que la variable donde guardamos el modelo, es decir que sin en la función anónima al modelo lo guardamos en la variable $user, el parámetro que va a recibir la ruta es {user}

Route::get('/{user}', function(App\Models\User $user) {
    return $user;
});
Enter fullscreen mode Exit fullscreen mode

También podemos hacerlo con los controladores:

en las rutas:

Route::get('/pruebacontroller/{user}', [App\Http\Controllers\PruebaController::class, 'getUser']);
Enter fullscreen mode Exit fullscreen mode

en el controlador:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PruebaController extends Controller
{
    public function getUser(\App\Models\User $user){
        return $user;
    }
}

Enter fullscreen mode Exit fullscreen mode

Forma implícita:

La forma implícita es usar la clase RouteServiceProvider y en el método boot() indicarle que a la clase Route le vamos a pasar un modelo, de esta manera:


public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });

        Route::model('user', User::class);
    }
Enter fullscreen mode Exit fullscreen mode

Ahora en la ruta especificamos el controlador que va a retornarnos los datos y el método correspondiente:

Route::get('/prueba/{user}', [App\Http\Controllers\PruebaController::class, 'getUsuario']);
Enter fullscreen mode Exit fullscreen mode

Y en nuestro controlador usamos el namespace del modelo User y se lo pasamos al método para poder retornar los datos

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use \App\Models\User;

class PruebaController extends Controller
{
    public function getUsuario(User $user){
        return $user;
    }
}
Enter fullscreen mode Exit fullscreen mode

Esto no s va a dar como resultado el usuario con su id correspondiente

Alt Text

Top comments (0)