라라벨에서 request 내부 호출 하는 방법

Updated on

livewire 로 작업하거나, function 으로 호출 안하고, request api 하나만 개발하고, 이것을 사용하고 싶을때가 있다.

예를 들면, 프론트엔드를 blade 나 livewire 로 작업하고 있는데, controller 에서 function 을 호출하는 것 보다는 function 기능들을 api 화 시키고, 차라리 controller 에서 내부 request 호출을 통해서 처리하는 것이다.

단점은 어쨌든 내부에서 호출이 발생된다는 점 ! 장점은 api 하나로만 관리 개발 할 수 있고, 나중에 blade 든 프론트든 보충 개발인력에게 api 만 전달해서 리뉴얼된 프론트를 작업할 수 있다는 장점이 있다.

내가 만드는 서비스가 혼자서 만들지만, 이 서비스의 가능성과 확장성 그리고 유지보수까지 생각한다면 단점은 단점이 아니게 된다, 이유는 어차피 나중에 해당 서비스의 가능성을 보고서, 푸시하려고 한다면 추가적인 개발인력은 필수가 되기 때문이다.

그랬을때, 내부 request 호출 (api) 방식으로 개발했을때, 아무것도 건드리지 않고 바로 api 를 이용해서 프론트를 추가 개발 할 수가 있다.

아, 물론 애초에 프로젝트 시작을 front 와 backend 프로젝트 자체를 분리시킨 경우에는 이렇게 할 필요가 없다.

    public function internalRequest(Request $request, string $uri, string $method): Response
    {
        $req = Request::create(
            $uri,
            $method,
            $request->all(),
            $request->cookie(),
            [],
            $request->server()
        );

        $req->headers->set('token', 'test');

        return Route::dispatch($req);
        return Container::getInstance()->handle($req);
    }

이 방식은 실제 HTTP 요청을 하지 않고, laravel 어플리케이션 내부에서 요청을 하기 때문에, 실제 http 요청이 발생하지 않는다.

24.10.17 추가 내용

위의 Route::dispatch() 방식으로 할 경우에 문제는 web, api middleware 를 타지 않는다. 그런데 웃긴게 api middleware 는 안되는데, web middleware 는 default 설정이기 때문에 무조건 web middleware를 타게 되는 문제가 있다.

그래서 Cookie나 Header에 대한 인증 등이 필요로 처리해야할 때에는 아래의 코드로 하면 해결된다. (아래의 코드는 route middleware 까지 모두 사용된다)

return Container::getInstance()->handle($req);
return app()->handle($req);

이 두가지를 사용해야지만 미들웨어까지 타게 된다 !