Laravel 5.3 - Auth Scaffolding Как вставляются ошибки

Я относительно новичок в Laravel и пытаюсь что-то понять. Я создал базовый проект и использовал `

`php artisan make: auth

`создать аутентификационные леса.

В сгенерированных представлениях доступна переменная $errors. Я знаю, что это можно вставить в представление с помощью метода withErrors().

Тем не менее, я не могу найти, как это вставлено в примере. Под капотом, похоже, работает следующая функция:

    /**
 * Handle a registration request for the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function register(Request $request)
{
    $this->validator($request->all())->validate();

    event(new Registered($user = $this->create($request->all())));

    $this->guard()->login($user);

    return $this->registered($request, $user)
                    ?: redirect($this->redirectPath());
}

Таким образом, вызывается метод validator для RegisterController по умолчанию, и он возвращает валидатор. Но я не могу понять, как ошибки из валидатора вставляются в представление auth.register.

2 ответа

Решение

Что происходит, когда возникает ошибка проверки, так это то, что Laravel выдает исключение. В этом случае экземпляр ValidationException брошен

Laravel обрабатывает любое неисследованное исключение, используя его Illuminate\Foundation\Exceptions\Handler учебный класс. В вашем приложении вы должны увидеть класс, который расширяет его в app/Exceptions/Handler.php, В этом классе вы увидите, что render метод вызывает его родителя render метод, который при проверке кода содержит следующие строки:

public function render($request, Exception $e)
{
    $e = $this->prepareException($e);

    if ($e instanceof HttpResponseException) {
        return $e->getResponse();
    } elseif ($e instanceof AuthenticationException) {
        return $this->unauthenticated($request, $e);
    } elseif ($e instanceof ValidationException) {
        return $this->convertValidationExceptionToResponse($e, $request);
    }

    return $this->prepareResponse($request, $e);
}

И если вы проверите дальше в том же классе, в методе convertValidationExceptionToResponse вы можете видеть, что Laravel высвечивает ошибки в ответ и перенаправляет обратно, с помощью ввода (когда запрос не ожидает JSON):

protected function convertValidationExceptionToResponse(ValidationException $e, $request)
{
    if ($e->response) {
        return $e->response;
    }

    $errors = $e->validator->errors()->getMessages();

    if ($request->expectsJson()) {
        return response()->json($errors, 422);
    }

    return redirect()->back()->withInput($request->input())->withErrors($errors);
}

RegisterController расширяет Controller, если мы посмотрим на класс Controller, то увидим использование trait Illuminate\Foundation\Validation\ValidatesRequests;

Если мы посмотрим глубже, мы найдем:

/**
     * Create the response for when a request fails validation.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  array  $errors
     * @return \Symfony\Component\HttpFoundation\Response
     */
    protected function buildFailedValidationResponse(Request $request, array $errors)
    {
        if ($request->expectsJson()) {
            return new JsonResponse($errors, 422);
        }

        return redirect()->to($this->getRedirectUrl())
                        ->withInput($request->input())
                        ->withErrors($errors, $this->errorBag());
    }
Другие вопросы по тегам