Laravel 컨트롤러는 ApiController를 meke하기 위해 callAction을 사용합니다.

8192 단어
대부분의 프로젝트에서 컨트롤러는 콘텐츠를 결정하기 위해 JSON을 지정하는 응답을 반환하는 데 사용됩니다.

laravel의 라우팅에서 ControllerDispatcher는 콜백 함수를 사용하여 해당 메소드를 호출한다는 것을 알았습니다.
Illuminate\Routing\ControllerDispatcher
    public function dispatch(Route $route, $controller, $method)
    {
        $parameters = $this->resolveClassMethodDependencies(
            $route->parametersWithoutNulls(), $controller, $method
        );

        if (method_exists($controller, 'callAction')) {
            return $controller->callAction($method, $parameters);
        }

        return $controller->{$method}(...array_values($parameters));
    }


컨트롤러가 실행하기 전에 컨트롤러에 callAtion라는 함수가 있는지 확인하는 것을 볼 수 있습니다. 그렇지 않은 경우 경로에 지정된 Controller 메서드를 반환하고 호출합니다.

이로 인해 Controller가 API 또는 WEB 라우팅을 구현할 때 디스플레이 콘텐츠에 대한 응답을 반환해야 한다는 생각이 들었습니다.

그 중 대부분의 사람들은 API 반환을 위해 json을 통일하겠지만 구현 방법은 상당히 다양하다.

Response::macro 방식이나 그런 방식을 본적이 있는데 이 방식은 나중에 유지하기 힘들 것 같아서,

컨트롤러가 200 또는 400 또는 200 + http 상태 코드 콘텐츠를 반환하기 위해 많은 판단을 하게 될 것입니다.

API 컨트롤러



내 프로젝트에서 ApiController를 빌드하고 경로의 API 폴더 아래에 있는 모든 콘텐츠가 ApiController를 상속받게 하고 모든 결과를 가로채서 API 응답으로 변환합니다.
ApiController
    public function callAction($method, $parameters)
    {
        $result =  $this->{$method}(...array_values($parameters));
        $httpStatus = ($method  === 'store') ? 201 : 200;
        if ($result instanceof ResponseSchema) {
            $response = &$result;
        } else {
            $response = new ResponseSchema($result);
        }
        $response->setStatus($httpStatus);
        return response()->json($response, $httpStatus);
    }


ResponseSchema 클래스를 생성하고 구체적으로 JSON 스키마 형식을 정의한 다음 균일하게 반환했습니다. 컨트롤러가 반환한 콘텐츠는 성공적인 실행의 결과입니다. 유일한 작은 차이점은 새로 추가된 메서드가 통합되어 있으며 스토어라고 부르며 http 상태 코드는 201을 반환한다는 것입니다.

여기에는 성공한 정보만 반환되기 때문에 Controller는 많은 try catch를 작성할 필요가 없으며 필요한 정보를 반환하는 데 집중할 수 있습니다.

오류 처리기



오류 처리는 어떻게 처리합니까? 공식 홈페이지에 언급된 the-exception-handler에 따르면 에러에 대한 특별한 에러 처리 Handler가 있기 때문에 App\Exceptions\Handler만, 이 프로그램은 에러 처리에 중점을 둡니다. 렌더링 함수에 ResponseSchema를 로드하고 해당 메서드를 내뱉으면 JSON Response Schema를 통합할 수 있습니다.

    public function render($request, Throwable $exception)
    {
        $responseSchema = new ResponseSchema();
        $statusCode = 500;
        $responseSchema->setException($exception);
        $responseSchema->setMessage('Server Error');
        $responseSchema->setStatus($statusCode);
        if ($request->is(['api/*', 'oauth/*'])) {
            $request->headers->set('Accept', 'application/json');
            return response($responseSchema->toArray(), $statusCode);
        }
        return parent::render($request, $exception);
    }



현재 이 방법은 API 응답을 구현하는 현재 방법이므로 컨트롤러 작성에 집중하고 계층적 분업의 목적을 달성할 수 있습니다.

좋은 웹페이지 즐겨찾기