<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use App\Exception\Api\ApiException;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class ApiExceptionSubscriber implements EventSubscriberInterface
{
public function __construct(private readonly LoggerInterface $logger)
{
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => 'onKernelException',
];
}
public function onKernelException(ExceptionEvent $exceptionEvent): void
{
$exception = $exceptionEvent->getThrowable();
if (!$exception instanceof ApiException) {
return;
}
$this->logger->notice($exception->getMessage(), [
'exception' => $exception,
]);
$response = new JsonResponse();
$response->setStatusCode($exception->getStatusCode());
$response->setData([
'message' => $exception->getMessage(),
'errors' => $exception->getErrors(),
]);
$exceptionEvent->setResponse($response);
}
}