You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel验证失败时,如何获取提交表单字段值及验证对象?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:07:06