Laravel 5.3 - Auth脚手架如何插入错误
Laravel 5.3 - Auth Scaffolding How Are Errors Inserted
我对 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());
}
所以默认RegisterController的validator方法被调用,它returns一个validator。但是我无法理解验证器的错误是如何插入到 auth.register 视图中的。
RegisterController extends Controller,如果我们查看 class Controller,我们可以看到 use 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());
}
发生验证错误时发生的情况是 Laravel 抛出异常。在这种情况下,抛出 ValidationException
的实例。
Laravel 使用它的 Illuminate\Foundation\Exceptions\Handler
class 处理任何未捕获的异常。在您的应用程序中,您应该会看到 class 将其扩展到 app/Exceptions/Handler.php
。在那个 class 中,您将看到 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);
}
如果您进一步检查相同的 class,在方法 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);
}
我对 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());
}
所以默认RegisterController的validator方法被调用,它returns一个validator。但是我无法理解验证器的错误是如何插入到 auth.register 视图中的。
RegisterController extends Controller,如果我们查看 class Controller,我们可以看到 use 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());
}
发生验证错误时发生的情况是 Laravel 抛出异常。在这种情况下,抛出 ValidationException
的实例。
Laravel 使用它的 Illuminate\Foundation\Exceptions\Handler
class 处理任何未捕获的异常。在您的应用程序中,您应该会看到 class 将其扩展到 app/Exceptions/Handler.php
。在那个 class 中,您将看到 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);
}
如果您进一步检查相同的 class,在方法 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);
}