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

Laravel表单验证后old()输入值始终返回Null问题排查

问题描述

我有一个供已认证用户使用的基础表单,代码如下:

<form method="POST" action="/admin/insert">
@csrf  
<div class="form-group">
<label>{{ __($cv->name) }}</label>
<input type="text" name="name" class="form-control @error($ck) is-invalid @enderror"  value="{{ old('name') }}" >
</div>
<button type="submit" class="btn btn-primary me-2">{{ __('Submit') }}</button>
</form>

为测试验证逻辑,我在控制器中故意让表单验证失败,对应代码:

if ($validator->fails()) {
    return back()->withErrors($validator)
        ->withInput($request->input());
}

我的会话驱动配置为file:

'driver' => env('SESSION_DRIVER', 'file'),

目前的问题是:验证失败后,blade模板中的old('name')始终返回Null,无法自动回填表单值,但项目中的登录表单功能完全正常。请问该问题的原因是什么?

问题排查与解决思路
  • 路由中间件缺失:确认/admin/insert路由是否包含web中间件。Laravel的会话、CSRF保护以及闪存输入功能都依赖web中间件组,登录表单正常说明其路由已加入该组,若后台表单路由遗漏,会话数据无法正常存储,old()就取不到值。
  • 会话目录权限异常:由于使用file会话驱动,需确保storage/framework/sessions目录具备服务器进程的读写权限(推荐设置为755)。权限不足会导致闪存的输入数据无法写入文件,页面刷新后old()无法读取到数据。
  • 字段名不匹配:输入框的错误类使用了@error($ck),但表单字段名为name。若$ck并非指向name,可能验证规则中的字段名与表单字段不一致,这种不匹配会影响old()的取值逻辑,建议改为@error('name')并同步验证规则中的字段名。
  • withInput()调用冗余:Laravel中back()->withInput()默认会闪存所有请求输入,无需手动传入$request->input()。简化为return back()->withErrors($validator)->withInput();可排除参数传递导致的异常。

内容的提问来源于stack exchange,提问作者user3432056

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:02:17