如何在登录失败时显示错误消息?

Abd*_*yan 2 laravel laravel-5 laravel-form

我使用以下命令创建身份验证系统:

php artisan make:auth
Run Code Online (Sandbox Code Playgroud)

效果很好。但是,当我尝试自定义设计和其他内容时,一切对我来说都显得很混乱。即:当我尝试使用错误的凭据时,我无法显示诸如“无效的用户名/密码”之类的消息。我检查了 Auth 文件夹内的所有控制器,但没有详细代码。我的要求非常简单:我只想将错误消息从控制器传递给我的自定义设计的 HTML 模板来查看和显示。这是我的登录表单:

@extends('layouts.login')

@section('content')
    <div class="content">
        <!-- BEGIN LOGIN FORM -->
        <form class="login-form" method="POST" action="{{ route('login') }}">
            @csrf

            <h3 class="form-title">Login to your account</h3>
             CUSTOM_ERROR_MESSAGE_IF_LOGIN_FAILED
            <div class="alert alert-danger display-hide">
                <button class="close" data-close="alert"></button>
                <span>
            Enter any username and password. </span>
            </div>
            <div class="form-group">
                <!--ie8, ie9 does not support html5 placeholder, so we just show field title for that-->
                <label class="control-label visible-ie8 visible-ie9">Username</label>
                <div class="input-icon">
                    <i class="fa fa-user"></i>
                    <!-- <input class="form-control placeholder-no-fix" type="text" autocomplete="off" placeholder="Username" name="username"/> -->
                    <input id="email" type="email" class="form-control placeholder-no-fix" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
                </div>
            </div>
            <div class="form-group">
                <label class="control-label visible-ie8 visible-ie9">Password</label>
                <div class="input-icon">
                    <i class="fa fa-lock"></i>
                    <!-- <input class="form-control placeholder-no-fix" type="password" autocomplete="off" placeholder="Password" name="password"/> -->
                    <input id="password" type="password" class="form-control placeholder-no-fix" name="password" required autocomplete="current-password">

                </div>
            </div>
            <div class="form-actions">
                <label class="checkbox">
                    <!-- <input type="checkbox" name="remember" value="1"/>  -->
                    <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
                    Remember me </label>

                <button type="submit" class="btn blue pull-right">
                    Login <i class="m-icon-swapright m-icon-white"></i>
                </button>
            </div>

            <div class="forget-password">
                <h4>Forgot your password ?</h4>
                <p>
                    no worries, click <a href="{{ route('password.request') }}" >
                        here </a>
                    to reset your password.
                </p>
            </div>
            <div class="create-account">
                <p>
                    Don't have an account yet ?&nbsp; <a href="javascript:;" id="register-btn">
                        Create an account </a>
                </p>
            </div>
        </form>
        <!-- END LOGIN FORM -->

    </div>

@endsection
Run Code Online (Sandbox Code Playgroud)

如何显示 CUSTOM_ERROR_MESSAGE_IF_LOGIN_FAILED?

Lea*_*ner 9

首先,相信我,我们都曾经经历过你现在所处的位置。学习一个新框架及其工作原理时会令人沮丧。

一个建议是彻底阅读文档,当谈到 Laravel 时,没有什么是你找不到的。至少,没有什么你经常需要的基础知识。

现在关于你的问题,你说:

我只想从控制器传递错误消息来查看并使用我自定义设计的 HTML 模板显示它。

因此,我将大胆猜测并说您正在自己处理登录过程,而不是使用内置的 Laravel 功能。

如果我错了,并且您正在使用内置的 Laravel 登录功能,那么您需要做的就是以下操作:

情况 1:当您使用内置 Laravel 登录功能时

@if ($errors->has('email'))
    <span class="invalid-feedback">
        <strong>{{ $errors->first('email') }}</strong>
    </span>
@endif
Run Code Online (Sandbox Code Playgroud)

当输入错误的凭据并尝试登录时,Laravel 会返回带有“email”键的错误,因此只需使用$errors->first('email')您想要的任何位置打印消息并根据您的喜好设置样式即可。

现在,如果我是对的并且您正在使用自定义登录方法:

情况 2:当您使用自定义登录功能时

在您的控制器中,您可以像这样自定义消息:

$messages = [
    'email.required' => 'Email is required!',
    'password.required' => 'Password is required!'
];

$validatedData = $request->validate([
    'email' => 'required|email',
    'password' => 'required|string',
], $messages);
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个示例,您可以有各种验证和各自的自定义消息。如果您想使用验证的内置错误消息,则只需不要提供消息数组,如下所示:

$validatedData = $request->validate([
    'email' => 'required|email',
    'password' => 'required|string',
]);
Run Code Online (Sandbox Code Playgroud)

当您使用validate()on 方法$request时,如果验证失败,Laravel 默认会向刀片返回一个有效的错误响应,该响应将具有与您的请求变量名称相同的键和与错误消息相同的值,您可以轻松访问它们,与 Case 中相同1:

@if ($errors->has('email'))
    <span class="invalid-feedback">
        <strong>{{ $errors->first('email') }}</strong>
    </span>
@endif
Run Code Online (Sandbox Code Playgroud)

你已经准备好了。最终,除了验证以下情况之外,也许您还想从控制器返回一些自定义错误:

情况 3:当您使用自定义登录功能并希望返回除验证之外的一些自定义错误消息时

在你的控制器内部使用withErrors()方法:

return Redirect::back()->withErrors(
    [
        'email' => 'Snap! you are done!'
    ]
);
Run Code Online (Sandbox Code Playgroud)

正如您可能已经猜到的,在视图中显示此错误与以前完全相同:

@if ($errors->has('email'))
    <span class="invalid-feedback">
        <strong>{{ $errors->first('email') }}</strong>
    </span>
@endif
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助

快乐编码:)


Sle*_*ren 5

您可以使用以下方法输出错误消息:

@if(count($errors) > 0)
 @foreach( $errors->all() as $message )
  <div class="alert alert-danger display-hide">
   <button class="close" data-close="alert"></button>
   <span>{{ $message }}</span>
  </div>
 @endforeach
@endif
Run Code Online (Sandbox Code Playgroud)

如果您有自定义路由,则需要从控制器重定向到登录页面并传递错误:

$errors = ['ur errors'];
return redirect()->back()->withErrors($errors);
Run Code Online (Sandbox Code Playgroud)