Laravel 8中redirect()->back()->withErrors丢失错误信息问题
问题原因及解决方案
原因
核心问题是GET和POST登录路由使用了重复的名称login,Laravel要求路由名称必须唯一,重复命名会干扰Session闪存数据的传递流程。当你用redirect()->back()->withErrors()时,错误信息会被临时存入Session,但路由名称冲突导致重定向后的GET请求无法正确读取Session中的错误数据,最终视图里的$errors为空。
解决方案
1. 给POST路由设置唯一名称
修改路由定义,为POST登录路由分配唯一名称,比如login.authenticate:
Route::middleware(['guest'])->group(function () { Route::get('/login', [LoginController::class, 'showLoginForm']) ->name('login'); Route::post('/login', [LoginController::class, 'authenticate']) ->name('login.authenticate'); // 设置唯一路由名称 });
2. 替换redirect()->back()为指定命名路由
在authenticate方法中,直接重定向到login命名路由,避免依赖back()的模糊跳转:
return redirect()->route('login')->withErrors([ 'email' => 'These credentials do not match our records.', ]);
修改后,错误信息会被正确闪存到Session,ShareErrorsFromSession中间件会自动将Session中的错误传递到登录视图,$errors变量就能正常显示错误内容。
可选验证方式
如果需要确认Session传递是否正常,可在登录视图中添加以下代码:
@if(session()->has('errors')) {{ session('errors')->first('email') }} @endif
内容的提问来源于stack exchange,提问作者Jean Paindaveine
相关产品推荐
相关产品推荐

