你在上下文中有请求,所以从这里它只是从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');
}