在laravel 5.1中,表单验证异常没有被异常捕获?

时间:2015-07-04 06:12:47

标签: php laravel exception laravel-5 laravel-5.1

在laravel5中,我在app/Exceptions/Handler@render函数中捕获了所有错误,但它运行正常。 代码如下,

     public function render($request, Exception $e) {
        $error_response['error'] = array(
            'code' => NULL,
            'message' => NULL,
            'debug' => NULL
        );
        if ($e instanceof HttpException && $e->getStatusCode() == 422) {
            $error_response['error']['code'] = 422;
            $error_response['error']['message'] = $e->getMessage();
            $error_response['error']['debug'] = null;
            return new JsonResponse($error_response, 422);
        } 
 }
        return parent::render($request, $e);
}

但是在laravel5.1中,当表单验证失效时,它会抛出错误消息并带有422异常。但它并没有从app/Exceptions/Handler@render开始,而是与abort(422)合作。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您只需执行

即可捕获
public function render($request, Exception $e) {
    if($e instanceof ValidationException) {
        // Your code here
    }
}

答案 1 :(得分:2)

当表单请求无法验证您的数据时,它会触发failedValidation(Validator $validator)方法,该方法会使用新的重定向响应引发HttpResponseException,但不会HttpException。此异常通过Laravel路由器以run(Request $request)方法捕获,并获取响应并触发它。因此,您没有机会通过Exceptions Handler处理它。

但是如果你想改变这种行为,你可以覆盖抽象请求或任何其他Request类中的failedValidation方法,并抛出你将在Handler中处理的异常。

或者您可以覆盖response(array $errors)并创建自己的响应,该响应将由路由器自动执行。