Laravel验证失败时,如何获取提交表单字段值及验证对象?
嘿,作为Laravel新手遇到这个问题太正常了,我来给你把这两个问题讲明白:
一、如何获取上一步提交的name、sku等字段值
最常用也最方便的方式是用Laravel提供的old()辅助函数,它专门用来读取验证失败后存在session里的输入数据:
在表单输入框里直接使用:
<input type="text" name="name" value="{{ old('name') }}"> <input type="text" name="sku" value="{{ old('sku') }}">这样验证失败重定向回来后,输入框会自动填充你之前提交的值;如果是编辑页面,还可以给
old()加第二个参数作为默认值(比如从数据库读取的产品原有值):<input type="text" name="name" value="{{ old('name', $product->name) }}">新增场景下第二个参数会被忽略,编辑场景下如果没有提交过值,就显示产品原有数据,验证失败后则显示提交的内容。
如果你想在控制器里获取这些值,也可以用
request()->old('name'),和old('name')效果完全一致,因为old()函数本质上就是封装了request()->old()这个方法。甚至可以不带参数调用old()或者request()->old(),直接获取所有提交的旧输入数组:$allOldInputs = old(); $name = $allOldInputs['name'];
二、验证失败时是否存在包含表单值的验证对象
答案是肯定的,分两种情况来看:
1. 自动验证场景(用$request->validate())
当你在控制器里用$request->validate()做验证时,一旦失败,Laravel会自动抛出ValidationException异常,这个异常内部包含了验证失败的信息,同时Laravel会自动帮你把表单输入数据存入session(也就是前面old()能读取到的来源)。
如果你想手动捕获这个异常来处理(一般不需要,Laravel默认会重定向回表单页),可以这样:
try { $validatedData = $request->validate([ 'name' => 'required', 'sku' => 'required|unique:products', ]); } catch (\Illuminate\Validation\ValidationException $e) { // 获取验证失败的错误信息 $errors = $e->errors(); // 获取所有提交的表单值,和$request->all()是一样的 $inputValues = $e->validator->getData(); // 或者获取通过了验证的字段值(如果有的话) $validated = $e->validator->validated(); return redirect()->back()->withErrors($errors)->withInput($inputValues); }
2. 手动创建Validator实例场景
如果你手动创建Validator对象来做验证,那验证失败后,这个Validator实例本身就包含了所有相关数据:
use Illuminate\Support\Facades\Validator; $validator = Validator::make($request->all(), [ 'name' => 'required', 'sku' => 'required|unique:products', ]); if ($validator->fails()) { // 获取所有提交的表单原始数据 $inputValues = $validator->getData(); // 获取验证失败的字段和对应的规则 $failedRules = $validator->failed(); // 获取通过验证的字段值 $validatedData = $validator->validated(); // 重定向回表单页,带着错误信息和输入数据 return redirect()->back()->withErrors($validator)->withInput(); }
这里的withInput()方法就是把表单值存入session,让前端能用old()读取到。
总的来说,日常开发中用old()辅助函数处理表单回显是最省心的,验证对象的话只有在需要自定义验证逻辑或者错误处理时才会用到~
内容的提问来源于stack exchange,提问作者JayK

