<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\Exception\InvalidArgumentException;
use App\External\Gitlab\RequestException;
use App\Service\TimeEntryManagement\Exception\CloseTimeEntryException;
use App\Service\TimeEntryManagement\Exception\ConflictTimeEntryException;
use App\Service\TimeEntryManagement\Exception\LongTimeLengthException;
use App\Service\TimeEntryManagement\Exception\ShortTimeLengthException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Serializer\Exception\ExceptionInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ExceptionSubscriber implements EventSubscriberInterface
{
public const ALLOWED_EXCEPTIONS = [
AccessDeniedHttpException::class,
ExceptionInterface::class,
InvalidArgumentException::class,
RequestException::class,
LongTimeLengthException::class,
ShortTimeLengthException::class,
CloseTimeEntryException::class,
ConflictTimeEntryException::class,
ConflictHttpException::class,
];
public function __construct(private TranslatorInterface $translator)
{
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => ['onException'],
];
}
/**
* @return void
*/
public function onException(ExceptionEvent $event)
{
$throwable = \get_class($event->getThrowable());
if (!\in_array($throwable, self::ALLOWED_EXCEPTIONS)) {
return;
}
$message = $this->translator->trans($event->getThrowable()->getMessage());
$event->setThrowable(new $throwable(message: $message, previous: $event->getThrowable()));
}
}