laravel 통 일 된 형식 오류 코드 문 제 를 되 돌려 줍 니 다.

6217 단어 laravel오류 코드
배경
최근 안 드 로 이 드 프로젝트 개발 을 공부 하고 있 습 니 다.백 엔 드 인터페이스 프로젝트 는 PHP 의 Yi 2.0 프레임 워 크 로 프로젝트 를 새로 시작 한 후 laravel 5.5 로 바 꾸 었 습 니 다.최근 laravel 이 새로운 버 전 을 업그레이드 하 는 것 을 보고 laravel 6.4 로 프로젝트 를 업데이트 하 였 습 니 다.
yii 와 laravel 을 사용 하 는 과정 에서 두 프레임 워 크 는 웹-api 에 대해 매우 우호 적 이 고 restful 에 대해 어느 정도 지 지 를 했 지만 문제 가 생 겼 습 니 다.다음은 laravel 6.4 를 예 로 들 어 제 가 겪 은 문 제 를 간단하게 설명 하 겠 습 니 다.
질문 1:액세스 인터페이스 반환 페이지 코드
가장 전형 적 인 것 은 laravel new 프로젝트 입 니 다.브 라 우 저 에서 localhost 를 직접 방문 하면 laravel 프레임 워 크 모델 의 기본 환영 페이지 에 들 어 갑 니 다.이것 은 큰 문제 가 없습니다.문 제 는 postman 으로 이 주 소 를 인터페이스 로 하 는 것 입 니 다.
호출,되 돌아 오 는 것 은 바로 페이지 의 코드 입 니 다.당신 이 안 드 로 이 드 에서 되 돌아 오 는 것 은 페이지 의 코드 입 니 다.사실 실제 사용 은 인 터 페 이 스 를 호출 하지 않 지만 인 터 페 이 스 를 호출 할 때 다른 오류 가 있 습 니 다.예 를 들 어 4xx,5xx 는 html 코드 를 되 돌려 줍 니 다.
안 탁 단 은 상태 코드 를 판단 해 요청 의 성공 실 패 를 판단 할 수 있 을 뿐 잘못된 정 보 를 얻 기 어렵다.사실 여 기 는 안 탁 단 에 헤 더 를 통일 할 수 있 지만.........................................................
첫 번 째 방법 은 postman 디 버 깅 을 해결 하 는 것 은 postman 요청 에 headers X-Requested-With:XML HttpRequest 를 설정 하여 ajax 요청 을 모 의 할 수 있 습 니 다.
두 번 째 방법 은 프로젝트 를 JSON 형식 으로 만 되 돌려 주 려 면 Middleware 를 새로 만들어 야 합 니 다.

namespace App\Http\Middleware;
use Closure;
class JsonApplication
{
  public function handle($request, Closure $next)
  {
    $request->headers->set('Accept', 'application/json');
    return $next($request);
  }
}
그리고 Kernel 에 Middleware 를 전역 적 으로 등록 하고 모든 api 요청 을 적용 합 니 다.

namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
  protected $middlewareGroups = [
    'api' => [
      ......
      'json_application',
    ],
  ];
  protected $routeMiddleware = [
    ......
    'json_application' => \App\Http\Middleware\JsonApplication::class,
  ];
}
이렇게 설정 하면 더 이상 인 터 페 이 스 를 호출 할 걱정 이 없습니다.페이지 코드 를 되 돌려 드 립 니 다.
질문 2:인터페이스 가 통 일 된 JSON 형식 으로 되 돌아 갑 니 다.
위의 설정 인 터 페 이 스 를 통 해 데 이 터 를 되 돌려 주 는 것 은 모두 JSON 형식 이지 만 계속 개발 하면 HTTP 상태 코드 를 통 해 성공 여 부 를 판단 하고 돌아 오 는 JSON 의 키 는 인터페이스 차이 가 매우 커서 같은 인터페이스 가 성공 과 오류 가 발생 했 을 때 도 다른 KEY 로 돌아 갑 니 다.
이 문 제 는 같은 형식 으로 되 돌아 가 는 문 제 를 많이 사용 합 니 다.전에 vue 에 인 터 페 이 스 를 많이 썼 기 때문에 이전의 key 모드 를 계속 사용 합 니 다.

{
  "code": "0",
  "msg": "ok",
  "data": ""
}
그러나 laravel 에서 이 형식 을 어떻게 되 돌려 주 느 냐 가 문제 가 되 었 다.인터넷 에서 여러 번 찾 아 보 았 지만 좋 은 해결 방법 이 없 었 다.대부분 덮어 쓰 는 상황 이 완비 되 지 않 았 고 오류 코드 오류 정 보 는 모두 논리 층 에 쓰 여 있 었 다.새로 추 가 된 것 은 충돌 이 있 는 지 전혀 몰 랐 다.
그 후에 BD 와 GG 에서 오랫동안 검색 을 했 고 자신 도 laravel 자체 의 이상 메커니즘 과 Middleware 로 처리 하려 고 했 지만 만 족 스 럽 지 못 했다.
자바 에서 오류 코드 를 처리 하 는 것 이 편리 하 다 는 것 을 잘 알 고 있 습 니 다.모든 오류 코드 를 안에 쓰 고 이상 을 던 질 때 매개 변 수 를 매개 변수 로 전달 하 는 것 을 직접 정의 합 니 다.이와 유사 하 다
매 거

package *.*.*
public enum ErrorCode {
  OK("ok", 0),
  PARAM_ERROR("param error", 88888),
  UNKNOWN_ERROR("unknown error", 99999);
  ErrorCode(String value, Integer key) {
    this.value = value;
    this.key = key;
  }
  private String value;
  private Integer key;
  public String getValue() {
    return value;
  }
  public Integer getKey() {
    return key;
  }
}
이상 류

package *.*.*;
import *.*.*.ErrorCode;
public class ApiException extends Exception {
  public int code = 0;
  public ApiException(ErrorCode errorCode) {
    super(errorCode.getValue());
    this.code = errorCode.getKey();
  }
  ......
}
쓰다

throw new ApiException(ErrorCode.UNKNOWN_ERROR);
그래서 PHP 의 매 거 진 을 조사해 보 니 정말 지원 되 었 지만 자세히 연구 해 보 니 PHP 의 매 거 진 은 SPL 을 켜 는 것 뿐만 아니 라 제공 하 는 방법 도 별 쓸모 가 없 었 다.
그래서 JAVA 를 본 떠 서 하나 썼어 요.
기본 클래스

namespace App\Enums;
abstract class Enum
{
  public static function __callStatic($name, $arguments)
  {
    return new static(constant('static::' . $name));
  }
}
오류 코드 는 마술 방법 을 사 용 했 기 때문에 주시 중 에 표시 해 야 합 니 다.

namespace App\Enums;
/**
 * @method static CodeEnum OK
 * @method static CodeEnum ERROR
 */
class CodeEnum extends Enum
{
  public const OK = ['0', 'ok'];
  public const ERROR = ['99999', 'fail'];
  private $code;
  private $msg;
  public function __construct($param)
  {
    $this->code = reset($param);
    $this->msg = end($param);
  }
  public function getCode()
  {
    return $this->code;
  }
  public function getMsg()
  {
    return $this->msg;
  }
}
사용자 정의 이상 클래스

namespace App\Exceptions;
use App\Enums\CodeEnum;
use Exception;
use Illuminate\Support\Facades\Log;
class ApiException extends Exception
{
  public function __construct(CodeEnum $enum)
  {
    parent::__construct($enum->getMsg(), $enum->getCode());
  }
  public function report()
  {
    Log::error("ApiException {$this->getFile()}({$this->getLine()}): code({$this->getCode()}) msg({$this->getMessage()})");
  }
  public function render($request)
  {
    return response([
      'code' => $this->getCode(),
      'msg' => $this->getMessage(),
      'data' => ''
    ]);
  }
}
호출

throw new ApiException(new CodeEnum(CodeEnum::ERROR)); //           
throw new ApiException(CodeEnum::OK()); //      java         
총결산
위 에서 말 한 것 은 편집장 이 소개 한 laravel 이 통 일 된 형식 오류 코드 문 제 를 되 돌려 드 리 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기