<?php
namespace App\Subscriber;
use App\Exception\AppException;
use App\Exception\ValidationException;
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;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class ApiExceptionSubscriber implements EventSubscriberInterface
{
private LoggerInterface $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::EXCEPTION => [
'onApiErrorException',
],
];
}
public function onApiErrorException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
if ($exception instanceof AppException) {
$this->logger->error($exception->getMessage());
$event->setResponse(new JsonResponse(['error' => $exception->getMessage()], $exception->getCode()));
return;
}
if ($exception instanceof ValidationException) {
$event->setResponse(new JsonResponse(['error' => $exception->getErrors()], $exception->getCode()));
return;
}
if ($exception instanceof AccessDeniedException) {
$event->setResponse(new JsonResponse(['error' => $exception->getMessage()], $exception->getCode()));
return;
}
}
}