Laravel Api表单验证失败被重定向到主页

发布日期: 2020-05-07 20:53:36 作者: Stephen 评论: 0

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

如图,我们在请求 /passport/_register 时,状态码变成了302,而后重新请求了 127.0.0.1,这显然不是我们所要的结果,我们需要在表单验证失败时,抛出异常,响应错误信息给前端。

首先,定位到父类源码 Illuminate\Foundation\Http\FormRequest,以寻求解决方案,在 FormRequest 类中,有一个方法 failedValidation

    /**
     * Handle a failed validation attempt.
     *
     * @param  \Illuminate\Contracts\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    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.结果:

快来抢沙发