es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo establecer el limitador de velocidad dinámicamente en Laravel 8.

Necesito establecer el limitador de tasa dinámicamente en Laravel 8 en función de la combinación de parámetros almacenados en una tabla de base de datos.

Clave Param 1 Param 2 Param 3 Límite de tasa
1 adx param1a param2d param3x 20
2 buz param1b param2u param3z 30
3 cfy param1c param2f param3y 40

El código del limitador de tasa será el siguiente:

protected function configureRateLimiting()
{
    RateLimiter::for('api', function (Request $request) {
        return [
            Limit::perMinute(rateLimit)->by(RateLimitKey)->response(function () {
                ...
            }),
            Limit::perMinute(rateLimit1)->by(RateLimitKey1)->response(function () {
                ...
            }),
        ];
    });
}

Necesito agregar el limitador de tasa al array devuelto en el código anterior.

El valor de la tasa de límite (RateLimit) será el valor de la columna “Límite de tasa” de la tabla de base de datos.

La clave de límite de tasa (RateLimitKey) será el valor con la combinación de las columnas Clave, Param 1, Param 2, Param 3 (por ejemplo, keyparam1param2param3).

Es necesario agregar el limitador de tasa dinámicamente usando los datos recuperados de la tabla de base de datos.

No estoy seguro de cómo proceder para agregar el limitador de tasa en Laravel 8.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar el limitador de velocidad dinámicamente en Laravel 8 basado en la combinación de parámetros almacenados en la tabla de la base de datos, puedes usar el método configureRateLimiting() en la clase App\Providers\RouteServiceProvider.

    En primer lugar, recupera los datos del límite de velocidad desde la tabla de la base de datos utilizando un generador de consultas o un ORM como Eloquent. Luego, itera a través de las filas y agrega cada limitador de velocidad a la matriz devuelta por el método configureRateLimiting().

    Aquí tienes un ejemplo de fragmento de código:

    use Illuminate\Cache\RateLimiting\Limit;
    use Illuminate\Cache\RateLimiting\RateLimiter;
    use Illuminate\Http\Request;
    
    ...
    
    protected function configureRateLimiting()
    {
        $rateLimits = DB::table('rate_limits')->get();
    
        RateLimiter::for('api', function (Request $request) use ($rateLimits) {
            $limits = [];
    
            foreach ($rateLimits as $rateLimit) {
                $key = $rateLimit->key . '_' . $rateLimit->param_1 . '_' . $rateLimit->param_2 . '_' . $rateLimit->param_3;
                $value = $rateLimit->rate_limit;
    
                $limits[] = Limit::perMinute($value)->by($key)->response(function () {
                    return response()->json(['message' => 'Too Many Requests'], 429);
                });
            }
    
            return $limits;
        });
    }
    

    En este ejemplo, recuperamos los datos del límite de velocidad desde la tabla rate_limits utilizando la fachada DB. Luego, iteramos a través de las filas y construimos la matriz del limitador de velocidad utilizando las clases Limit y RateLimiter.

    Para cada fila, creamos una clave de limitador de velocidad concatenando las columnas key, param_1, param_2 y param_3 con guiones bajos. También recuperamos el valor de columna rate_limit.

    Finalmente, agregamos una instancia de Limit a la matriz $limits utilizando el método perMinute() con $value como límite de velocidad, el método by() con $key como clave del limitador de velocidad y un cierre para la respuesta cuando se excede el límite de velocidad.

    Ten en cuenta que devolvemos la matriz $limits en el cierre RateLimiter::for() para aplicar los limitadores de velocidad al grupo de middleware api.

    De esta manera, puedes establecer el limitador de velocidad dinámicamente en Laravel 8 basado en la combinación de parámetros almacenados en la tabla de la base de datos.

Comments are closed.