<?php
namespace App\EventListener;
use App\Entity\User;
use App\Service\RequestLoggerService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Uid\Ulid;
class RequestLogSubscriber implements EventSubscriberInterface
{
const REQUEST_ID_KEY = 'app_request_id';
/**
* @param RequestLoggerService $requestLoggerService
* @param Security $security
*/
public function __construct(
private readonly RequestLoggerService $requestLoggerService,
private readonly Security $security,
)
{
}
/**
* @param RequestEvent $event
* @return void
*/
public function onKernelRequest(RequestEvent $event): void
{
if (!($this->security->getUser() instanceof User)) {
return;
}
$request = $event->getRequest();
$requestId = $this->requestLoggerService->createLog($request);
$request->attributes->set(static::REQUEST_ID_KEY, $requestId);
}
/**
* @param ResponseEvent $event
* @return void
*/
public function onKernelResponse(ResponseEvent $event): void
{
if (!($this->security->getUser() instanceof User)) {
return;
}
$requestId = $event->getRequest()->attributes->get(static::REQUEST_ID_KEY);
if (!($requestId instanceof Ulid)) {
return;
}
$this->requestLoggerService->updateLogFromHttpResponse($requestId, $event->getResponse());
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
}