<?php
namespace App\EventListener;
use Psr\Log\LoggerInterface;
use ApiPlatform\Core\EventListener\EventPriorities;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\RequestEvent;
class ApiPlatformListener implements EventSubscriberInterface
{
private $logger;
private $handledExceptions = [];
public function __construct(LoggerInterface $apiPlatformLogger)
{
$this->logger = $apiPlatformLogger;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => ['onKernelRequest', EventPriorities::POST_READ],
KernelEvents::EXCEPTION => 'onKernelException'
];
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
if (null !== $request->attributes->get('_api_resource_class')) {
$this->logger->info($request->getMethod(), [
'url' => $request->getUri(),
'resource' => $request->attributes->get('_api_resource_class'),
'parameters' => $request->query->all(),
'body' => $request->getContent(),
'client_ip' => $request->getClientIp(),
]);
}
}
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
$request = $event->getRequest();
if (null === $request->attributes->get('_api_resource_class')) {
return;
}
$requestId = md5($request->getUri() . $request->getClientIp() . $request->getContent());
if (isset($this->handledExceptions[$requestId])) {
return;
}
$this->handledExceptions[$requestId] = true;
$this->logger->error($exception->getMessage(), [
'code' => $exception->getCode(),
'method' => $request->getMethod(),
'url' => $request->getUri(),
'parameters' => $request->query->all(),
'body' => $request->getContent(),
'client_ip' => $request->getClientIp(),
]);
}
}