Laravel 은 Api 에 적합 한 이상 처리 응답 형식 을 어떻게 실현 합 니까?

머리말
Laravel 전역 에서 이상 을 포착 하면 이상 을 해당 하 는 데이터 형식 으로 되 돌려 줍 니 다.만약 규정된 데이터 형식 에 상응하는 것 을 원한 다 면,우 리 는 이상 포획 후의 처리 방법 을 다시 쓰기 만 하면 된다.
이상 처리 프로 세 스
Illuminate\Foundation\\Exception\Handler 의 render 방법 은 이상 을 응답 으로 바 꾸 는 데 사 용 됩 니 다.

public function render($request, Exception $e)
{
 if (method_exists($e, 'render') && $response = $e->render($request)) {
 return Router::toResponse($request, $response);
 } elseif ($e instanceof Responsable) {
 return $e->toResponse($request);
 }

 $e = $this->prepareException($e);

 if ($e instanceof HttpResponseException) {
 return $e->getResponse();
 } elseif ($e instanceof AuthenticationException) {
 return $this->unauthenticated($request, $e);
 } elseif ($e instanceof ValidationException) {
 return $this->convertValidationExceptionToResponse($e, $request);
 }

 return $request->expectsJson()
   ? $this->prepareJsonResponse($request, $e)
   : $this->prepareResponse($request, $e);
}
render()에 서 는 prepareException()을 호출 하여 일부 이상 을 예비 처 리 했 으 나 응답 으로 전환 하 는 작업 을 수행 하지 않 았 습 니 다.
ModelNotFoundException 은 일반적으로 모델 에서 버 리 는 것 을 찾 을 수 없습니다.prepareException()에 서 는 Symfony 패키지 의 NotFoundHttp Exception 으로 바 뀌 었 습 니 다.기본 상태 코드 404;
AuthorizationException 은 Policy 권한 이 통과 되 지 않 았 을 때 던 집 니 다.prepareException()에 서 는 Symforny 패키지 의 AccessDeniedHttpException,기본 상태 코드 403 으로 전 환 됩 니 다.
TokenMismatchException 은 CSRF 인증 이 통과 되 지 않 았 을 때 던 집 니 다.prepareException()에서 Symforny 패키지 의 HttpException 으로 전환 되 었 고 주어진 상태 코드 419;
기타 이상 은 바로 돌아 갑 니 다.

protected function prepareException(Exception $e)
{
 if ($e instanceof ModelNotFoundException) {
 $e = new NotFoundHttpException($e->getMessage(), $e);
 } elseif ($e instanceof AuthorizationException) {
 $e = new AccessDeniedHttpException($e->getMessage(), $e);
 } elseif ($e instanceof TokenMismatchException) {
 $e = new HttpException(419, $e->getMessage(), $e);
 }

 return $e;
}
render()로 돌아 가 이상 을 미리 처리 한 후 Http Response Exception,Authentication Exception,ValidationException 을 각각 처리 하고 응답 으로 되 돌려 줍 니 다.
이 이외 의 이상 은 prepareJSonResponse()나 prepareResponse()에서 처리 되 며,expectsJSon()은 json 응답 으로 돌아 가 는 지 일반 응답 으로 돌아 가 는 지 판단 합 니 다.
이상 응답 형식 수정
이상 처리 절 차 를 알 고 이상 응답 형식 을 처리 합 니 다.
로그 인 인증 이상 형식 수정
위 에서 알 수 있 듯 이 Authentication Exception 이 캡 처 된 후 unauthenticated()를 호출 하여 처리 합 니 다.

protected function unauthenticated($request, AuthenticationException $exception)
{
 return $request->expectsJson()
    ? response()->json(['message' => $exception->getMessage()], 401)
    : redirect()->guest($exception->redirectTo() ?? route('login'));
}
app Exceptions Handler.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 이 포 획 된 후에 convert ValidationException ToResponse()에 의 해 처리 되 고 이 방법 에 들 어간 후에 우 리 는 계속 추적 해 야 한다.만약 에 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);
}
우 리 는 app Exceptions Handler.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',
 ];
}
app Exceptions Handler.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',
 ];
}
제 이 슨 응답 강제
코드 에 expectsJSon()이 여러 번 나 타 났 습 니 다.이 방법 은 json 응답 으로 돌아 가 는 지 일반 응답 으로 돌아 가 는 지 판단 하 는 데 사 용 됩 니 다.

public function expectsJson()
{
 return ($this->ajax() && ! $this->pjax() && $this->acceptsAnyContentType()) || $this->wantsJson();
}
다음 두 가지 조건 하에 서 json 응답 을 되 돌려 줍 니 다.
XML 요청 이 아 닌 pjax 이 며 Headers 에서 Accept 는 모든 형식 응답 을 받 는 것 으로 설정 되 어 있 습 니 다.
Headers Accept 는/json,+json 으로 설정 합 니 다.Accept:application/json.
이외에 도 json 에 응답 하지 않 을 것 입 니 다.우 리 는 미들웨어 를 이용 하여 Accept:application/json 을 강제로 추가 하여 이상 응답 시 json 으로 돌아 갈 수 있 습 니 다.(튜 토리 얼 L03 6.0 에서 언급 한 방법 참조)
미들웨어 AcceptHeader 만 들 기

<?php

namespace App\Http\Middleware;

use Closure;

class AcceptHeader
{
 public function handle($request, Closure $next)
 {
  $request->headers->set('Accept', 'application/json');

  return $next($request);
 }
}
app/Http/Kernel.php 에서 중간 부품 을 루트 그룹 에 추가 하면 됩 니 다.

protected $middlewareGroups = [
 'web' => [
  .
  .
  .
 'api' => [
  \App\Http\Middleware\AcceptHeader::class,
  'throttle:60,1',
  'bindings',
 ],
];
큰 성 과 를 거두다.
총결산
Laravel 이 Api 에 적합 한 이상 처리 응답 형식 을 어떻게 실현 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Laravel 이 Api 에 적합 한 이상 처리 응답 형식 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기