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  ·  4年前

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

附言 2  ·  4年前

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 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);
    }

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

4年前 评论

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

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

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

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

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!