Laravel自定义Form Request实例化时跳过验证的问题及解决
Laravel自定义Form Request手动实例化时验证失效的解决
问题场景
我在Laravel中创建了包含授权逻辑和验证规则的自定义Form Request(CustomFormRequest):
- 通过依赖注入方式将其传入
CustomClass时,Laravel会自动执行验证,失败则返回422错误; - 手动实例化
CustomRequest并设置请求方法、添加数据后传入CustomClass时,Laravel会跳过验证流程,导致无效数据被写入数据库。
尝试过的无效方案
曾使用$request->validate($request->rules())进行手动验证,但触发了ERR_TOO_MANY_REDIRECTS错误。
解决方法
感谢@matthew-bradley的思路,调整代码后解决了问题:
原错误代码
$data = [...]; $validator = Validator::make($data, (new CustomRequest())->rules());
修改后代码
$data = [...]; $request = new CustomRequest(); $request->setMethod('POST'); $request->request->add($data); $validator = Validator::make($data, $request->rules());
原因分析
直接调用(new CustomRequest())->rules()时,CustomRequest的rules方法中$this->request->get(...)无法获取到传入的数据,而我的自定义验证规则(CustomRule)需要依赖这些数据完成校验,因此必须先实例化请求对象并填充数据,再调用其rules方法。
验证结果处理
最后添加验证失败的响应逻辑:
if($validator->fails()) { response()->json(['errors' => $validator->messages()->getMessages()], 422)->send(); die; } else { new CustomClass($request); };
内容的提问来源于stack exchange,提问作者Erős Tamás Mihály
相关产品推荐
相关产品推荐

