首页 文章

laravel 5 在哪里处理 ValidationException?

提问于
浏览
2

如果传入请求是 AJAX 请求,则不会生成重定向。相反,具有 422 状态代码的 HTTP 响应将返回到包含验证错误的 JSON 表示的浏览器。

这不行!我试图通过 ajax 请求访问路由,然后重定向回来。

如果验证通过,您的代码将继续正常执行。但是,如果验证失败,将抛出 Illuminate\Contracts\Validation\ValidationException。将自动捕获此异常,并为用户的先前位置生成重定向。验证错误甚至会自动闪现到会话中!

现在我想知道 laravel 在哪里捕获此异常以便我可以修改它?

2 回答

  • 1

    这是在 FormRequest 类中处理的:

    protected function failedValidation(Validator $validator)
    {
        throw new HttpResponseException($this->response(
            $this->formatErrors($validator)
        ));
    }
    

    您可以在自己的 Request 对象中覆盖此函数,并以您喜欢的任何方式处理失败的验证。

  • 0

    经过一段时间的研究后,我会发布我的结果,所以有这个问题的人可以节省很多时间。

    @Faiz,如果你想坚持 laravel 行为,你在技术上不应该改变一件事(我总是试图遵循泰勒的建议)。因此,要获得 422 响应代码状态,您需要告诉phpunit您将发送XMLHttpRequest。也就是说,这适用于 laravel 5

    $response = $this->call('POST', $url, [], [], [],
            ['HTTP_X_Requested-With' => 'XMLHttpRequest']);
    

    有关Github 问题的更多信息。此外,如果你看Symfony\Component\HttpFoundation\Request@isXmlHttpRequest,你会发现这个标题被“常见的 JavaScript 框架”使用并引用这个链接

    尚未在浏览器上进行测试,但我认为这也应该有效。

相关问题