Laravel自定义FormRequest验证时如何标记报错表单?
解决方案
针对同一页面多表单验证的区分需求,提供两种实现思路,优先推荐原生特性方案:
方法一:利用Laravel原生Error Bag(推荐)
Laravel自带错误袋(Error Bag)功能,可直接为每个表单的验证错误分配独立存储空间,天然隔离不同表单的错误与旧值。
- 为每个FormRequest设置专属错误袋
// FormARequest.php class FormARequest extends FormRequest { protected $errorBag = 'formA'; // 表单A的错误标识 public function rules() { return [ 'name' => 'required|string', // 其他表单A规则 ]; } }
// FormBRequest.php class FormBRequest extends FormRequest { protected $errorBag = 'formB'; // 表单B的错误标识 public function rules() { return [ 'email' => 'required|email', // 其他表单B规则 ]; } }
- 前端模板区分处理错误与旧值
<!-- 表单A --> <form method="POST" action="{{ route('formA.submit') }}"> @csrf @if($errors->formA->any()) <div class="alert alert-danger"> {{ $errors->formA->first('name') }} </div> @endif <input type="text" name="name" value="{{ old('name', '', 'formA') }}"> <button type="submit">提交表单A</button> </form> <!-- 表单B --> <form method="POST" action="{{ route('formB.submit') }}"> @csrf @if($errors->formB->any()) <div class="alert alert-danger"> {{ $errors->formB->first('email') }} </div> @endif <input type="email" name="email" value="{{ old('email', '', 'formB') }}"> <button type="submit">提交表单B</button> </form>
old()方法第三个参数指定错误袋,确保仅加载对应表单的旧提交值,彻底解决跨表单加载错误旧值的问题。
方法二:自定义追加errorform标识
若需在$errors集合中显式添加errorform字段,可重写FormRequest的验证失败逻辑:
- 在FormRequest中添加标识并修改错误集合
use Illuminate\Validation\ValidationException; class FormARequest extends FormRequest { protected $formId = 'formA'; public function rules() { return [ 'name' => 'required|string', ]; } protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator) { // 向错误集合追加表单标识 $validator->errors()->add('errorform', $this->formId); // 保留原生验证失败流程 parent::failedValidation($validator); } }
FormBRequest同理,设置$formId = 'formB'即可。
- 前端通过标识判断表单
<!-- 表单A --> <form method="POST" action="{{ route('formA.submit') }}"> @csrf @if($errors->has('errorform') && $errors->first('errorform') === 'formA') <div class="alert alert-danger"> {{ $errors->first('name') }} </div> <input type="text" name="name" value="{{ old('name') }}"> @else <input type="text" name="name" value=""> @endif <button type="submit">提交表单A</button> </form>
此方案需注意:若多表单存在同名字段,错误信息会出现冲突,仅适合字段完全不重复的场景。
内容的提问来源于stack exchange,提问作者carbonisle
相关产品推荐
相关产品推荐

