发送短信验证码限流了,但是手机号已经存在报错,怎么删除限流器
这是路由代码
Route::post('verificationCodes/register', [VerificationCodesController::class, 'register'])->middleware(['throttle:verification'])
->name('verificationCodes.register');
使用了FormRequest验证
class RegisterVerificationCodeRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
*/
public function rules(): array
{
return [
'phone' => [
'required',
'regex:/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199)\d{8}$/',
'unique:users'
]
];
}
}
你们是怎么解决手机号提示已经存在,然后顺便把限流清除的
RateLimiter::for('verification', function (Request $request) {
return Limit::perMinute(1)->response(function (Request $request, array $headers) {
return response(['message' => '短信获取间隔60秒,请勿频繁发送'], 429, $headers);
})->by($request->phone);
});
一分钟只能请求一次对不,那么请求的时候发现手机号已经存在,那么就意味着还的再等一分钟,我想在报错的时候,顺便把请求器给清空一下
半天没看懂
没明白楼主的问题,手机号已存在的异常跟限流应该没有关系?仅仅是触发了请求的规则。
说一下我的理解:如果短信通道侧对验证码有较严格的下发规则,发验证码的限流不要在入口(中间件)做,应该在下发的逻辑中根据手机号和短信类型(模板)限流。
楼主的异常应该是 'unique:users' 这个规则引发的,这个查询也不建议在入口(请求规则)做,应在下发逻辑前进行验证查询。
Request 类里面实现
failedValidation
方法(验证失败时执行)、或者passedValidation
(验证结束时执行,无论失败、成功)。在这里面处理就好了