<?php
namespace App\EventSubscriber;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class ApiRequestLogSubscriber implements EventSubscriberInterface
{
public function __construct(private readonly LoggerInterface $logger)
{
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
public function onKernelController(ControllerEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$controller = $event->getController();
if (is_array($controller)) {
$controllerClass = get_class($controller[0]);
$controllerMethod = $controller[1];
} elseif (is_object($controller)) {
$controllerClass = get_class($controller);
$controllerMethod = '__invoke';
} else {
return;
}
if (!str_starts_with($controllerClass, 'App\\Controller\\API\\')) {
return;
}
$request = $event->getRequest();
$this->logger->info('API call', [
'route' => $request->attributes->get('_route'),
'method' => $request->getMethod(),
'path' => $request->getPathInfo(),
'query' => $request->query->all(),
'controller' => $controllerClass . '::' . $controllerMethod
]);
}
}