使用会话在登录表单上显示错误的问题

Posted

技术标签:

【中文标题】使用会话在登录表单上显示错误的问题【英文标题】:Problem with displaying errors on login form using sessions 【发布时间】:2020-11-27 18:54:27 【问题描述】:

我在 Laravel 中有登录表单,但我无法在我的电子邮件和密码字段中显示错误。我制作了验证器,其中包含该错误消息,并将其放入会话中并将其重定向到 GET /login。我需要有关如何从会话中读取这些值并将它们作为参数返回到刀片中的帮助,然后才能显示电子邮件和密码的这些错误消息。目前验证有效,但它不显示任何消息,它只重定向回登录页面。任何帮助表示赞赏。这是我的代码。

web.php

Route::post('/login', 'Auth\LoginController@login')->name('login');

登录控制器

public function showLoginForm(Request $request)

    $session = $request->session()->get('data');

    return view('auth.login', compact('session'));


public function login(Request $request)

    $rules = array(
        'email'    => 'required|email', 
        'password' => 'required|alphaNum|min:3'
    );

    $validator = Validator::make($request->all(), $rules);

    if ($validator->fails()) 
        $request->session()->put('data', $request->input());
        return redirect()->intended('login')
            ->withErrors($validator)
            ->withInput($request->session()->put('data', $request->input()));
     else 
        $userData = array(
            'email'     => $request->get('email'),
            'password'  => $request->get('password')
        );
    
    
    if (Auth::attempt($userData)) 
        return redirect()->intended('dashboard');
     else         
        redirect()->intended('login');
    

登录刀片

<div class="login-page">
        <div class="login-box">
            <div class="card mb-0">
                <div class="card-body login-card-body">
                    <p class="login-box-msg font-weight-bold">Sign in to start your session</p>
                    <form method="POST" class="mb-4" action="route('login') ">
                        @csrf
                        <div class="input-group mb-3">
                            <input id="email" type="email" placeholder="Email" class="form-control @error('email') is-invalid @enderror" name="email" value=" old('email') " autocomplete="email" autofocus>
                            <div class="input-group-append">
                                <div class="input-group-text">
                                    <span class="fas fa-user"></span>
                                </div>
                            </div>
                            @error('email')
                            <span class="invalid-feedback" role="alert">
                                <strong> $message </strong>
                            </span>
                            @enderror
                        </div>
                        <div class="input-group mb-3">
                            <input id="password" type="password" placeholder="Password" class="form-control @error('password') is-invalid @enderror" name="password" autocomplete="current-password">
                            <div class="input-group-append">
                                <div class="input-group-text">
                                    <span class="fas fa-eye-slash cursor-pointer" style="display: none" onclick="showPassword()"></span>
                                    <span class="fas fa-eye cursor-pointer" onclick="showPassword()"></span>
                                </div>
                            </div>
                            @error('password')
                            <span class="invalid-feedback" role="alert">
                                <strong> $message </strong>
                            </span>
                            @enderror
                        </div>
                        <div class="float-right">
                            <button type="submit" class="btn btn-primary btn-block font-weight-bold">Sign In</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>

【问题讨论】:

【参考方案1】:

您必须致电-&gt;withErrors($validator-&gt;errors())。这将返回正确的MessageBag。否则,您将返回一个 Validator 实例。 之后,您可以按预期使用$errors 变量或@error 标记。

@编辑 插入inteded() 使用route()back()

【讨论】:

好的,我在控制器中添加了这个,但还是一样,没有显示任何消息。 我把它放在 ->withInput() 上还是一样的。 '闪到会话'是什么意思? 使用-&gt;intended() 背后的想法是什么,也许您需要调用-&gt;route()。您可以在您的视图中使用 dd($errors) 吗?我谈到了`$request->session()->put('data', $request->input());`这部分在我看来是不需要的。 @mrmar 而不是预期()我会简单地将它们重定向回来() @mrmar 抱歉我之前没看到。假设您的电子邮件是唯一的,您首先必须获取 $request->email 所在的行。 $user = User::where('email', $request-&gt;email)-&gt;first()。然后您可以使用以下方式检查它:Hash::check($request-&gt;password, $user-&gt;password)laravel.com/docs/7.x/hashing

以上是关于使用会话在登录表单上显示错误的问题的主要内容,如果未能解决你的问题,请参考以下文章

用户登录时不显示表单,但用户注销时显示

如何使用节点 js 、 react js 、 sql 中的会话以表格格式显示登录的用户详细信息?

Spring Security:在覆盖会话之前显示警告

在 PHP 登录脚本中使用会话和会话变量

openActiveSessionWithPublishPermissions 显示登录表单两次

用户登录时不显示表单,但在用户注销时显示