Php Laravel Spark-我可以限制每月的计划API调用和每分钟/小时的API调用吗?

Php Laravel Spark-我可以限制每月的计划API调用和每分钟/小时的API调用吗?,php,laravel,throttling,Php,Laravel,Throttling,我想使用Laravel Spark为API创建不同的许可证。我想限制每月和每小时/分钟的API调用。例如,基本许可证允许每月10000次api调用,但我还想限制同一帐户每小时/分钟的api调用。这可以用laravel spark来完成吗 有:节流和速率限制,但我可以限制每月和每小时/分钟的API调用总数吗?例如:每月总共10000次api调用,每小时/分钟最多60次api调用 根据文档,我可以限制每分钟/小时的访问: 类似这样的东西结合了油门和速率限制: Route::middleware('a

我想使用Laravel Spark为API创建不同的许可证。我想限制每月和每小时/分钟的API调用。例如,基本许可证允许每月10000次api调用,但我还想限制同一帐户每小时/分钟的api调用。这可以用laravel spark来完成吗

有:节流和速率限制,但我可以限制每月和每小时/分钟的API调用总数吗?例如:每月总共10000次api调用,每小时/分钟最多60次api调用

根据文档,我可以限制每分钟/小时的访问:

类似这样的东西结合了油门和速率限制:

Route::middleware('auth:api', 'throttle:10|rate_limit,1')->group(function () {     
Route::get('/user', function () { // }); 
});

但我的主要问题是如何将每分钟/小时的速率限制与每月限制结合起来?

创建一个中间件,并在最后一个api请求发出时检查该中间件。

来自同一文档页面:

您还可以将此功能与动态速率限制结合使用。例如,如果您的
User
模型包含
rate\u limit
属性,您可以将该属性的名称传递给
throttle
中间件,以便它用于计算经过身份验证的用户的最大请求计数

因此,鉴于上述情况,您可以在
用户
模型上添加一个基于当前订阅计划获取费率限制值的:

类用户扩展可验证性
{
公共函数getRateLimitAttribute()
{
//如果它是一个模型,就获得许可证
如果($license=='basic'){
返回10000;
}
//在这里返回一些默认值
}
}
然后,您可以像这样使用动态速率限制值:

Route::middleware('auth:api','throttle:rate\u limit,1')->组(函数(){
//收费有限的路线
});
至于每月限额,你需要在某处设置一个计数器,并在每次请求时进行检查。您可以在另一个中间件中记录每个API请求:

类日志请求
{
公共函数句柄($request,Closure$next)
{
返回$next($request);
}
公共功能终止($request,$response)
{
LogRequestJob::dispatch($request);
}
}
类LogRequestJob实现了ShouldQueue
{
使用可调度、可交互、可排队、可序列化的模型;
公共函数构造(请求$Request)
{
$this->request=$request;
}
公共函数句柄()
{
//插入用于用户记录请求的行
请求日志::创建([
'user_id'=>this->request->user()->getKey(),
'path'=>this->request->path(),
//存储您感兴趣的任何其他请求数据
]);
}
}
然后,您需要在处理请求之前检查计数,再次使用中间件:

使用Symfony\Component\HttpKernel\Exception\toomanyrequestshttpeexception;
类CheckRequestInLimit
{
公共函数句柄($request,Closure$next)
{
$year=碳::现在()->年;
$month=碳::现在()->月份;
$count=RequestLog::user($request->user())->year($year)->month($month)->count();
$limit=$request->user()->monthly_limit;//另一个访问者
如果($count<$limit){
返回$next($request);
}
//计数等于(或大于)限制;引发异常
$retryAfter=Carbon::today()->addMonth()->startOfMonth();
$message='您已超过每月限额';
抛出新的TooManyRequestsHttpException($retryAfter,$message);
}
}

希望这能让你深思

我正在考虑使用中间件,但是我应该如何计算每月的呼叫数?我怎么知道用户什么时候使用了我应该将它们存储在数据库中的所有内容呢?我知道了,谢谢。我会将每月的api调用存储在Redis中,我会使用Laravel的默认限制来限制每分钟/小时的api调用。感谢您分享每月api速率限制解决方案。我可以把它和小时/分钟的费率限制结合起来吗?每小时60个电话,每月10000个电话?可以增加多个利率限制吗?我算出来了,谢谢。我会将每月的api调用存储在Redis中,并使用Laravel的默认限制来限制每分钟/小时的api调用。