Как показать сообщение об ошибке при неудачной авторизации? - PullRequest
0 голосов
/ 18 июня 2019

Я делаю систему аутентификации, используя следующую команду:

php artisan make:auth

Работает нормально. Но когда я пытаюсь настроить дизайн и другие вещи, мне все кажется беспорядочным. Т.е., когда я пытаюсь использовать неправильные учетные данные, я не могу показать сообщение типа «Неверное имя пользователя / пароль». Я проверяю все контроллеры внутри папки 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

Как мне показать CUSTOM_ERROR_MESSAGE_IF_LOGIN_FAILED?

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Прежде всего, поверь мне, мы все были там, где ты сейчас. Это разочарование при изучении новой структуры и как она работает.

Один совет - внимательно изучить документацию, там нет ничего, что вы не можете найти там, когда дело доходит до Laravel. Ну, по крайней мере, ничего, что вам часто нужно.

Теперь о вашей проблеме, вы сказали:

Я просто хочу передать сообщение об ошибке от контроллера, чтобы просмотреть и показать его с моим собственным HTML-шаблоном.

Итак, я собираюсь сделать дикое предположение и сказать, что вы сами обрабатываете процесс входа в систему, а не используете встроенную функциональность Laravel.

В случае, если я ошибаюсь, и вы используете встроенную функцию входа в laravel, все что вам нужно сделать, это:

Случай 1: при использовании встроенной функции входа в Laravel

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

Laravel возвращает ошибки с ключами «электронная почта» при вводе неверных учетных данных и пытается войти в систему, поэтому просто распечатайте сообщение, используя $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);

Конечно, это всего лишь пример, вы можете иметь различные проверки и соответствующие пользовательские сообщения. Если вы хотите использовать встроенные сообщения об ошибках проверки, просто не предоставляйте массив сообщений, например:

$validatedData = $request->validate([
    'email' => 'required|email',
    'password' => 'required|string',
]);

Когда вы используете validate() метод на $request, если проверка не пройдена, Laravel по умолчанию возвращает действительный ответ об ошибке для блейда, этот ответ будет иметь ключи, такие же, как имя и значение переменной вашего запроса, что и сообщение об ошибке, и вы можно легко получить к ним доступ, так же, как в случае 1:

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

И вы настроены. В конечном итоге, возможно, из вашего контроллера вы захотите вернуть какую-то пользовательскую ошибку, кроме проверки следующего случая использования:

Случай 3: когда вы используете пользовательские функции входа в систему и хотите вернуть пользовательское сообщение об ошибке, отличное от проверки

Внутри вашего контроллера используйте withErrors() метод:

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

Как вы уже догадались, показ этой ошибки внутри вашего представления точно такой же, как и раньше:

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

Надеюсь, это поможет

Удачного кодирования:)

0 голосов
/ 18 июня 2019

Вы можете выводить сообщения об ошибках, используя:

@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

А если у вас есть собственный маршрут, вам нужно перенаправить на страницу входа с вашего контроллера и передать ошибки:

$errors = ['ur errors'];
return redirect()->back()->withErrors($errors);
...