Laravel如何实现适合Api的异常处理响应格式

2020-06-14 11:59:54于丽

在 appExceptionsHandler.php 中重写 unauthenticated() 使其返回我们想要的数据格式。

protected function unauthenticated($request, AuthenticationException $exception)
{
 return $request->expectsJson()
  ? response()->json([
   'code' => 0,
   'data' => $exception->getMessage(),
  ], 401)
  : redirect()->guest($exception->redirectTo() ?? route('login'));
}

修改验证异常格式

同样由上文可知,ValidationException 被捕获后交由 convertValidationExceptionToResponse() 处理,进入此方法后我们需要继续追踪,若是需要 json 响应,最终交由 invalidJson() 处理。

protected function convertValidationExceptionToResponse(ValidationException $e, $request)
{
 if ($e->response) {
  return $e->response;
 }

 return $request->expectsJson()
    ? $this->invalidJson($request, $e)
    : $this->invalid($request, $e);
}
protected function invalidJson($request, ValidationException $exception)
{
 return response()->json([
  'message' => $exception->getMessage(),
  'errors' => $exception->errors(),
 ], $exception->status);
}

我们继续在 appExceptionsHandler.php 重写 invalidJson() 即可自定义返回格式。

protected function invalidJson($request, ValidationException $exception)
{
 return response()->json([
  'code' => 0,
  'data' => $exception->errors(),
 ], $exception->status);
}

修改其他异常格式

其他异常是调用 prepareJsonResponse() 来处理,此方法又调用 convertExceptionToArray() 来处理响应格式。

protected function prepareJsonResponse($request, Exception $e)
{
 return new JsonResponse(
  $this->convertExceptionToArray($e),
  $this->isHttpException($e) ? $e->getStatusCode() : 500,
  $this->isHttpException($e) ? $e->getHeaders() : [],
  JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES
 );
}
protected function convertExceptionToArray(Exception $e)
{
 return config('app.debug') ? [
  'message' => $e->getMessage(),
  'exception' => get_class($e),
  'file' => $e->getFile(),
  'line' => $e->getLine(),
  'trace' => collect($e->getTrace())->map(function ($trace) {
   return Arr::except($trace, ['args']);
  })->all(),
 ] : [
  'message' => $this->isHttpException($e) ? $e->getMessage() : 'Server Error',
 ];
}

在 appExceptionsHandler.php 中重写 convertExceptionToArray() 来自定义其他异常响应格式。

protected function convertExceptionToArray(Exception $e)
{
 return config('app.debug') ? [
  'code' => 0,
  'data' => $e->getMessage(),
  'exception' => get_class($e),
  'file' => $e->getFile(),
  'line' => $e->getLine(),
  'trace' => collect($e->getTrace())->map(function ($trace) {
   return Arr::except($trace, ['args']);
  })->all(),
 ] : [
  'code' => 0,
  'data' => $this->isHttpException($e) ? $e->getMessage() : 'Server Error',
 ];
}								 
			 
相关文章 大家在看