<?phpnamespace App\EventSubscriber\Api;use App\Helper\Api\Logging\CorrelationIdService;use Exception;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpKernel\Event\RequestEvent;use Symfony\Component\HttpKernel\Event\TerminateEvent;use Symfony\Component\HttpKernel\KernelEvents;/** * Event subscriber to manage correlation IDs for HTTP requests. * * Initializes a correlation ID at the start of each request and resets it * when the request is complete. Supports propagating correlation IDs from * incoming X-Correlation-ID headers. * * @package API * @internal */class CorrelationIdSubscriber implements EventSubscriberInterface{ /** * Correlation ID service. * * @var CorrelationIdService */ protected CorrelationIdService $correlationIdService; /** * Get subscribed events. * * @return array<string, array<int, string|int>> */ public static function getSubscribedEvents(): array { return [ KernelEvents::REQUEST => ['onKernelRequest', 1024], KernelEvents::TERMINATE => ['onKernelTerminate', -1024], ]; } /** * Constructor. * * @param CorrelationIdService $correlationIdService Correlation ID service */ public function __construct(CorrelationIdService $correlationIdService) { $this->correlationIdService = $correlationIdService; } /** * Initialize correlation ID on request start. * * Checks for an existing X-Correlation-ID header and uses it if present, * otherwise generates a new correlation ID. * * @param RequestEvent $event The request event * @return void * @throws Exception */ public function onKernelRequest(RequestEvent $event): void { if (!$event->isMainRequest()) { return; } $request = $event->getRequest(); // Check if correlation ID is provided in request headers if ($request->headers->has('X-Correlation-ID')) { $correlationId = $request->headers->get('X-Correlation-ID'); if (!empty($correlationId)) { $this->correlationIdService->setCorrelationId($correlationId); return; } } // Generate a new correlation ID if not provided $this->correlationIdService->getCorrelationId(); } /** * Reset correlation ID after request is complete. * * @param TerminateEvent $event The terminate-event * @return void */ public function onKernelTerminate(TerminateEvent $event): void { if (!$event->isMainRequest()) { return; } $this->correlationIdService->reset(); }}