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
相关产品推荐
相关产品推荐

