<?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
]);
}
}