3

在 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 中,当表单验证失败时,它会抛出异常的错误消息422app/Exceptions/Handler@render 但它并没有从 abort(422).

我该如何解决这个问题?

4

2 回答 2

4

你可以通过做简单地抓住

public function render($request, Exception $e) {
    if($e instanceof ValidationException) {
        // Your code here
    }
}
于 2016-08-17T11:18:45.740 回答
3

当表单请求无法验证您的数据时,它会触发failedValidation(Validator $validator)抛出HttpResponseException新重定向响应的方法,但不会触发HttpException. 这个异常是通过 Laravel Router 在其run(Request $request)方法中捕获的,并获取响应并触发它。所以你没有任何机会通过你的异常处理程序来处理它。

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

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

于 2015-07-04T09:12:00.227 回答