Laravel Api 开发中,需要实现表单验证,但发现了一个问题,在 Laravel 中,api开发实现表单验证,如果验证失败,会被302重定向到主页。

如图,我们在请求 /passport/_register 时,状态码变成了302,而后重新请求了 127.0.0.1,这显然不是我们所要的结果,我们需要在表单验证失败时,抛出异常,响应错误信息给前端。
首先,定位到父类源码 IlluminateFoundationHttpFormRequest,以寻求解决方案,在 FormRequest 类中,有一个方法 failedValidation:
/**
* Handle a failed validation attempt.
*
* @param IlluminateContractsValidationValidator $validator
* @return void
*
* @throws IlluminateValidationValidationException
*/
protected function failedValidation(Validator $validator)
{
throw (new ValidationException($validator))
->errorBag($this->errorBag)
->redirectTo($this->getRedirectUrl());
}
/**
* Get the URL to redirect to on a validation error.
*
* @return string
*/
protected function getRedirectUrl()
{
$url = $this->redirector->getUrlGenerator();
if ($this->redirect) {
return $url->to($this->redirect);
} elseif ($this->redirectRoute) {
return $url->route($this->redirectRoute);
} elseif ($this->redirectAction) {
return $url->action($this->redirectAction);
}
return $url->previous();
}这个方法显然是处理验证失败的,后面被重定向了,解决方法,我们可以重写 failedValidation 方法。
1.新建 ApiRequest.php
php artisan make:request ApiRequest2.在 ApiRequest 中重写 failedValidation
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json([
'error' => (new ValidationException($validator))->errors()
], JsonResponse::HTTP_UNPROCESSABLE_ENTITY));
}3.继承 ApiRequest
class RegisterRequest extends ApiRequest
{
// 省略
}4.结果:



