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 无效的格式"]
}
}