1

我需要根据存储在数据库表中的参数组合在 laravel 8 中动态设置速率限制器

编号 钥匙 参数 1 参数 2 参数 3 速率限制
1 广告 param_1_a param_2_d param_3_x 20
2 嗡嗡声 param_1_b param_2_u param_3_z 30
3 cfy param_1_c param_2_f param_3_y 40

和速率限制器代码如下

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

我需要将速率限制器添加到上面代码中返回的数组中

RateLimit 值将是数据库表中“Rate Limit”列的值

RateLimitKey 将值与列 Key、Param 1、Param 2、Param 3 的组合(例如,key_param1_param2_param_3)

需要使用从数据库表中检索到的数据动态添加速率限制器

我不确定如何继续在 laravel 8 中添加速率限制器

4

1 回答 1

1

你在上下文中有请求,所以从这里它只是从DB. 我假设它们是查询参数。请记住,这可以为空,并且需要有一个后备。

DB::table('rate_limiting_table')
    ->where('key', $request->query('key'))
    ->where('param_1', $request->query('param_1'))
    ->where('param_2', $request->query('param_2'))
    ->where('param_3', $request->query('param_3'))
    ->first();

由于这将在每个 HTTP 请求上执行,我建议缓存它。

$cacheKey = $request->query('key') . $request->query('param_1') . $request->query('param_2') . $request->query('param_3');
cache()->remember($cacheKey, 14400, function () { // cached for 4 hours
    return ... // your query
});

将所有这些逻辑放在一起,它可能看起来像这样。有一些小的干净代码改进。

const DEFAULT_RATE_LIMITING = 60;

protected function configureRateLimiting()
{
    RateLimiter::for('global', function (Request $request) {
        $rateLimiting = $this->getCacheRateLimiting();

        return $rateLimiting ? $rateLimiting->rate_limit : static::DEFAULT_RATE_LIMITING;
    });
}

private function getRateLimitingDatabase(): ?object 
{
    DB::table('rate_limiting_table')
        ->where('key', $request->query('key'))
        ->where('param_1', $request->query('param_1'))
        ->where('param_2', $request->query('param_2'))
        ->where('param_3', $request->query('param_3'))
        ->first();
}

private function getCacheRateLimiting(): ?object 
{
    // cached for 4 hours
    return cache()->remember($this->getRateLimitingCacheKey(), 14400, function () {
        return  $this->getRateLimitingDatabase();
    });
}

private function getRateLimitingCacheKey(): string
{
    return $request->query('key')
        . $request->query('param_1')
        . $request->query('param_2')
        . $request->query('param_3');
}
于 2021-12-01T08:34:55.933 回答