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 ApiRequest
2.在 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.结果: