Laravel 修改验证异常的响应格式

Laravel 默认验证不通过后响应格式如下,有时此格式并不满足自己要求,需要修改格式。


// status 422

{

    "message":"The given data was invalid.",

    "errors":{

        "url":[

            "url 无效的格式"

        ]

    }

}

当 Request 验证失败时会抛出 ValidationException 异常,最终交由全局异常 Handler 类处理。Handler 继承自 Illuminate\Foundation\Exceptions\Handler,框架中的 Handler 类调用 render 处理异常并进行响应,针对于 ValidationException 异常又调用了 convertValidationExceptionToResponse 方法来处理。代码


protected function convertValidationExceptionToResponse(ValidationException $e, $request)

{

    if ($e->response) {

        return $e->response;

    }

    return $request->expectsJson()

                ? $this->invalidJson($request, $e)

                : $this->invalid($request, $e);

}

expectsJson() 区分是 ajax 请求还是表单请求,然后分别做处理。


protected function invalidJson($request, ValidationException $exception)

{

    return response()->json([

        'message' => $exception->getMessage(),

        'errors' => $exception->errors(),

    ], $exception->status);

}

追踪到 invalidJson(),发现他就是用来处理参数验证异常响应格式的方法。在 App\Exceptions\Handler 类中,重写 invalidJson() 方法即可。


protected function invalidJson($request, ValidationException $exception)

{

    return response()->json([

        'code' => 0,

        'data' => $exception->errors(),

    ], $exception->status);

}

最终,验证失败的响应格式如下


// status 422

{

    "code": 0,

    "data":{

        "url":[

            "url 无效的格式"

        ]

    }

}
本作品采用《CC 协议》,转载必须注明作者和本文链接
附言 1  ·  5年前

请求 Content-Type 需设置为 application/json,当 application/x-www-form-urlencoded 时并不生效。

附言 2  ·  4年前

请求 Accept 需设置为 application/json,表示期待 json 响应。若前端不愿设置,后端可以通过中间件设置 Accept

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

这样改不合适,你应该在 Handler 中 这样会更合适

    if(Str::lower($request->segment(1)) === 'api'){
        if ($exception instanceof ValidationException) {
             return response()->json(
                 [
                     'code' => 0,
                      'message' => $exception->validator->errors()->first(),
                      'data' => $exception->errors(),
                 ],$exception->status);
        }
    }else{
            return parent::render($request, $exception);
    }

答案不一定标准,请参考。

5年前 评论

@pan_zoe 我觉得楼主的方式更为妥善

5年前 评论
pan_zoe 5年前
pan_zoe 5年前
Mr-houzi (楼主) 5年前
Mr-houzi (楼主) 5年前
Shuyi

还是建议直接改 response () 这个方法,创建一个母类,然后你所有验证消息的架构都一起改了(亦可以通过这个方法强制把所有验证错误转为 JSON)

5年前 评论
Mr-houzi (楼主) 5年前
Shuyi (作者) 5年前