> 백엔드 개발 > PHP 튜토리얼 > Symfony의 HeaderBag를 서비스로 사용: API 컨텍스트의 디버깅 초능력

Symfony의 HeaderBag를 서비스로 사용: API 컨텍스트의 디버깅 초능력

Susan Sarandon
풀어 주다: 2024-11-28 04:53:14
원래의
673명이 탐색했습니다.

Using Symfony’s HeaderBag as a Service: A Debugging Superpower in API Contexts

소개

API를 구축한다는 것은 캐시, 미들웨어 및 성능 최적화의 복잡한 계층을 처리한다는 의미입니다. 이러한 레이어는 프로덕션에 도움이 되지만 실제 데이터 흐름을 모호하게 만들 수도 있습니다. 특정 요청에서 캐시가 적중되었는지 또는 누락되었는지 어떻게 알 수 있나요? 간단한 방법 중 하나는 응답에 맞춤 헤더를 추가하여 귀중한 통찰력을 얻는 것입니다.

이 기사에서는 Symfony의 HeaderBag가 ​​서비스로 등록되었을 때 프로덕션에서 API 디버깅을 위한 강력한 도구가 될 수 있는 방법을 보여 드리겠습니다. 캐시 적중 및 누락을 나타내는 사용자 정의 헤더를 첨부하면 불필요한 로깅을 추가하거나 실행 흐름을 중단하지 않고도 API에서 무슨 일이 일어나고 있는지 즉시 이해할 수 있습니다.

왜 HeaderBag인가?

Symfony의 HeaderBag는 HttpFoundation 구성 요소의 일부이며 Symfony의 요청 및 응답 개체에서 내부적으로 사용됩니다. 이는 HTTP 헤더와 상호 작용하는 구조화된 방법을 제공하므로 깔끔한 객체 지향 방식으로 헤더를 추가, 수정 및 검색할 수 있습니다. 따라서 특히 디버깅 시나리오에서 API 실행 중 사용자 정의 헤더를 관리하는 데 적합합니다.

하지만 그 이상입니다. HeaderBag를 서비스로 등록하고 이를 애플리케이션 전체에서 사용하여 코드를 깔끔하게 유지하고 디버깅 일관성을 유지할 수 있습니다.

1단계: HeaderBag를 서비스로 등록

두 가지 방법 중 하나로 HeaderBag를 서비스로 쉽게 등록할 수 있습니다.

옵션 1: 사용자 정의 서비스에서 HeaderBag 확장

HeaderBag를 확장하는 사용자 정의 서비스를 생성한 다음 애플리케이션에서 사용할 수 있습니다.

<?php
declare(strict_types=1);

namespace App\Service;

use Symfony\Component\HttpFoundation\HeaderBag;

class ResponseHeaderService extends HeaderBag
{
}
로그인 후 복사
로그인 후 복사

옵션 2: services.yaml에서 정의

또는 services.yaml에서 HeaderBag를 서비스로 직접 등록할 수도 있습니다.

my.awesome.headerbag:
    class: 'Symfony\Component\HttpFoundation\HeaderBag'
로그인 후 복사
로그인 후 복사

두 방법 모두 동일한 목표를 달성합니다. 즉, 앱 전체에서 HeaderBag를 서비스로 사용할 수 있도록 허용하는 것입니다.

2단계: 이벤트 구독자를 통해 사용자 정의 헤더 추가

HeaderBag를 서비스로 등록한 후 다음 단계는 Symfony의 응답 개체와 상호 작용하도록 만드는 것입니다. 이벤트 구독자가 참여하는 곳입니다. KernelEvents::RESPONSE 이벤트를 구독하면 응답이 클라이언트로 다시 전송되기 전에 응답에 사용자 정의 헤더를 삽입할 수 있습니다.

다음은 HeaderBag에 저장된 헤더를 추가하는 이벤트 구독자를 생성하는 방법에 대한 예입니다.

<?php
declare(strict_types=1);

namespace App\EventSubscriber;

use App\Service\ResponseHeaderService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

readonly class ResponseHeadersEventSubscriber implements EventSubscriberInterface
{
    public function __construct(
        private ResponseHeaderService $responseHeaderService
    )
    {}

    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::RESPONSE => 'onKernelResponse'
        ];
    }

    public function onKernelResponse(ResponseEvent $event): void
    {
        $response = $event->getResponse();

        $response->headers->add($this->responseHeaderService->all());
    }
}
로그인 후 복사
로그인 후 복사

HeaderBag를 services.yaml의 서비스로 등록하려면 Autowire 속성을 사용해야 합니다.

<?php
declare(strict_types=1);

namespace App\Service;

use Symfony\Component\HttpFoundation\HeaderBag;

class ResponseHeaderService extends HeaderBag
{
}
로그인 후 복사
로그인 후 복사

3단계: 캐시 진단 구현

이제 재미있는 부분이 있습니다. 이 서비스를 사용하여 캐시 적중 및 누락을 추적하는 것입니다. 다음은 일부 결과를 계산하고, 캐시 적중을 확인하고, 캐시 적중 또는 누락 여부를 나타내는 응답에 사용자 정의 헤더를 추가하는 서비스의 예입니다.

my.awesome.headerbag:
    class: 'Symfony\Component\HttpFoundation\HeaderBag'
로그인 후 복사
로그인 후 복사

이 예에서는 UniverseService가 캐시와 상호 작용할 때마다 캐시 적중 여부를 나타내는 X-Universe-Cache 헤더를 설정합니다. 그러면 이 헤더가 이벤트 구독자의 응답에 자동으로 추가됩니다. 결과는? 모든 API 응답에는 캐시 사용 여부에 대한 즉각적인 통찰력을 제공하는 간단하고 유용한 헤더가 포함되어 있습니다.

귀하의 응답은 다음과 같습니다.

<?php
declare(strict_types=1);

namespace App\EventSubscriber;

use App\Service\ResponseHeaderService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

readonly class ResponseHeadersEventSubscriber implements EventSubscriberInterface
{
    public function __construct(
        private ResponseHeaderService $responseHeaderService
    )
    {}

    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::RESPONSE => 'onKernelResponse'
        ];
    }

    public function onKernelResponse(ResponseEvent $event): void
    {
        $response = $event->getResponse();

        $response->headers->add($this->responseHeaderService->all());
    }
}
로그인 후 복사
로그인 후 복사




결론

Symfony의 HeaderBag를 서비스로 사용하는 것은 API 개발에서 강력한 도구이며, 특히 복잡한 캐싱 계층이 있는 프로덕션 환경에서 실행할 때 더욱 그렇습니다. API 응답에 사용자 정의 헤더를 추가하면 캐시 상태를 빠르게 확인하여 디버깅 및 최적화 프로세스를 개선할 수 있습니다.

다음번에 특정 요청이 캐시되었는지 궁금하다면 추가한 헤더를 살펴보세요. 바로 거기에서 답을 얻을 수 있습니다!

위 내용은 Symfony의 HeaderBag를 서비스로 사용: API 컨텍스트의 디버깅 초능력의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿