如何拦截Laravel FormRequest验证失败时自动生成的JSON响应?
当然可以通过ValidationException实现自定义JSON响应的需求,下面是两种实用的实现方式,你可以根据场景选择:
方法一:在自定义FormRequest类中重写failedValidation方法
因为你的UserStoreRequest继承了FormRequest,直接在这个类里重写验证失败的处理逻辑,就能针对该请求类单独定制响应:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\ValidationException; class UserStoreRequest extends FormRequest { // 你的验证规则、授权逻辑... protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator) { // 仅针对AJAX/JSON请求返回自定义响应 if ($this->wantsJson()) { $customResponse = response()->json([ 'code' => 422, 'message' => '表单验证失败', 'errors' => $validator->errors()->messages() // 键值对格式的错误信息,也可用all()转成数组 ], 422); // 通过ValidationException绑定自定义响应后抛出 throw (new ValidationException($validator))->response($customResponse); } // 非JSON请求走默认验证失败逻辑 parent::failedValidation($validator); } }
方法二:全局拦截ValidationException(异常处理器中统一处理)
如果希望所有验证失败的AJAX请求都返回统一格式的响应,可修改App\Exceptions\Handler类的render方法:
<?php namespace App\Exceptions; use Illuminate\Validation\ValidationException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Throwable; class Handler extends ExceptionHandler { // 其他默认代码... public function render($request, Throwable $exception) { // 捕获AJAX/JSON请求下的ValidationException if ($request->wantsJson() && $exception instanceof ValidationException) { return response()->json([ 'code' => 422, 'status' => 'error', 'msg' => '提交的数据不符合要求', 'error_details' => $exception->validator->errors()->messages() ], 422); } return parent::render($request, $exception); } }
两种方式都基于ValidationException实现:第一种是通过它的response()方法绑定自定义响应后抛出,针对单个请求类;第二种是全局捕获该异常并返回自定义结构,覆盖所有验证场景。
内容的提问来源于stack exchange,提问作者mzhkhokhar
相关产品推荐
相关产品推荐

