Laravel表单验证错误无法显示问题求助
问题解决:表单验证错误与登录失败提示不显示
问题背景
提交表单时,无论是验证规则不满足还是登录凭证错误,页面都没有任何提示信息,通过@dump(Session::has('status'))和@dump($errors->any())排查,这两个值始终返回false。
相关代码如下:
控制器登录方法
public function login(Request $request) { $credentials = $request->validate([ 'email' => 'email|max:90|required', 'password' => 'required|min:6', ]); if (Auth::attempt($credentials, true)) { $accessToken = auth()->user()->createToken('authToken')->plainTextToken; return redirect('/home')->withCookie('auth_token', $accessToken); } else { $notification = 'L\'email ou le mot de passe est incorrecte'; return back()->with('status', $notification); } }
表单视图代码
<form action="{{ url('/authentification') }}" class="request-form ftco-animate bg-primary" method="POST"> @csrf <h2>Connexion</h2> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif @if (Session::has('status')) <div class="alert alert-danger"> {{ Session::get('status') }} </div> @endif <div class="form-group"> <label for="" class="label">Email</label> <input type="text" class="form-control" placeholder="Email" name="email"> </div> <div class="form-group mr-2"> <label for="" class="label">Mot de passe</label> <input type="password" class="form-control" placeholder="**********" name="password"> </div> <div class="form-group"> <input type="submit" value="Connexion" class="btn btn-secondary py-3 px-4"> <a href="{{ url('/register') }}" class="text-center" style="color: white;">Pas encore de compte ?</a> </div> </form>
核心原因分析
出现该问题的核心原因是会话(Session)未正常工作,导致验证错误和状态提示无法被存储或读取;其次是登录失败时的提示数据传递逻辑存在兼容性问题。
具体解决方案
1. 确保路由归属web中间件组
Laravel的会话、CSRF保护等核心功能依赖web中间件组,若登录路由未包含在该中间件下,session将无法正常存储数据。检查routes/web.php中的路由定义,确保提交路由在web中间件范围内:
// routes/web.php Route::post('/authentification', [YourAuthController::class, 'login']);
(注:web.php中的路由默认已自动应用web中间件组)
2. 统一错误提示传递逻辑
将登录失败的提示改为通过withErrors方法存入$errors对象,和表单验证错误统一处理,避免单独依赖session的status字段:
public function login(Request $request) { $credentials = $request->validate([ 'email' => 'email|max:90|required', 'password' => 'required|min:6', ]); if (Auth::attempt($credentials, true)) { $accessToken = auth()->user()->createToken('authToken')->plainTextToken; return redirect('/home')->withCookie('auth_token', $accessToken); } else { // 改用withErrors将错误信息存入$errors对象 return back()->withErrors([ 'email' => 'L\'email ou le mot de passe est incorrecte' ]); } }
修改后,可移除视图中@if (Session::has('status'))相关的判断代码,所有错误都会通过现有的$errors->any()逻辑展示。
3. 检查会话配置有效性
若以上步骤无效,检查.env文件中的会话驱动配置:
SESSION_DRIVER=file
默认file驱动稳定性强,若使用database等其他驱动,需确保对应的数据表已通过php artisan session:table和php artisan migrate命令创建。
验证效果
修改完成后测试两种场景:
- 提交空表单或不符合规则的邮箱/密码,页面应显示表单验证错误;
- 输入格式正确但无效的邮箱/密码,页面应显示"邮箱或密码错误"的提示。
内容的提问来源于stack exchange,提问作者Thomas A
相关产品推荐
相关产品推荐

