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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:45:05