Laravel 11本地化会话配置致表单验证错误提示不显示求助
解决表单验证错误不显示问题(语言切换中间件冲突)
检查中间件执行顺序
确保StartSession中间件在SetLocale之前执行——验证错误存储在会话闪存数据中,必须先启动会话才能读取这些数据。在bootstrap/app.php中调整顺序:
// 正确顺序:先启动会话,再设置语言 $middleware->add(StartSession::class); $middleware->add(SetLocale::class);
修改SetLocale中间件,避免丢失闪存数据
如果你的SetLocale中间件包含语言切换后的重定向逻辑,会直接清空闪存的验证错误数据。调整逻辑,仅在语言实际变更时重定向,同时保留表单输入和错误信息:
public function handle(Request $request, Closure $next) { if ($request->has('lang') && in_array($request->lang, ['fr', 'en', 'de'])) { session(['locale' => $request->lang]); // 保留输入数据和错误信息后再重定向 return redirect()->back()->withInput($request->input())->withErrors(session('errors')); } app()->setLocale(session('locale', 'en')); return $next($request); }
确保验证错误正确闪存到会话
如果是手动编写验证逻辑,要明确调用withErrors()将错误传递到视图:
$validator = Validator::make($request->all(), [ 'name' => 'required', 'email' => 'required|email', ]); if ($validator->fails()) { return redirect()->back()->withErrors($validator)->withInput(); }
使用Laravel内置的validate()方法时,框架会自动处理错误闪存,无需额外操作。
检查视图错误渲染逻辑
确保视图中正确读取会话中的错误信息,比如使用Laravel官方推荐的@error指令:
<div class="form-group"> <label for="name">Name</label> <input type="text" name="name" id="name" value="{{ old('name') }}"> @error('name') <div class="text-danger">{{ $message }}</div> @enderror </div>
或者批量展示所有错误:
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
排查会话存储配置
确认.env文件中的会话驱动配置有效,且存储目录具备读写权限:
SESSION_DRIVER=file SESSION_LIFETIME=120
内容的提问来源于stack exchange,提问作者Steph74
相关产品推荐
相关产品推荐

