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());
}