src/EventListener/ExceptionListener.php line 64

Open in your IDE?
  1. <?php
  2. namespace Harmonizely\EventListener;
  3. use Harmonizely\Core\Exception\BaseException;
  4. use Harmonizely\Core\Exception\Contract\IBaseException;
  5. use Harmonizely\Core\Exception\RedirectToRoute;
  6. use Harmonizely\Core\Exception\SubscriptionExpiredException;
  7. use Harmonizely\Core\Exception\UnexpectedException;
  8. use Harmonizely\Core\Response\Contract\IResponseBuilder;
  9. use Harmonizely\Service\UserLoginAttempt\Exception\AccessDeniedException as AccessDeniedExceptionUserLoginAttempt;
  10. use Psr\Log\LoggerInterface;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  13. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. class ExceptionListener
  16. {
  17.     /**
  18.      * @var SessionInterface
  19.      */
  20.     private SessionInterface $session;
  21.     /**
  22.      * @var UrlGeneratorInterface
  23.      */
  24.     private UrlGeneratorInterface $urlGenerator;
  25.     /**
  26.      * @var IResponseBuilder
  27.      */
  28.     private IResponseBuilder $responseBuilder;
  29.     /**
  30.      * @var LoggerInterface
  31.      */
  32.     private LoggerInterface $logger;
  33.     /**
  34.      * @param SessionInterface $session
  35.      * @param UrlGeneratorInterface $urlGenerator
  36.      * @param IResponseBuilder $responseBuilder
  37.      * @param LoggerInterface $logger
  38.      */
  39.     public function __construct(
  40.         SessionInterface $session,
  41.         UrlGeneratorInterface $urlGenerator,
  42.         IResponseBuilder $responseBuilder,
  43.         LoggerInterface $logger
  44.     )
  45.     {
  46.         $this->session $session;
  47.         $this->urlGenerator $urlGenerator;
  48.         $this->responseBuilder $responseBuilder;
  49.         $this->logger $logger;
  50.     }
  51.     /**
  52.      * Handle kernel exception event
  53.      *
  54.      * @param ExceptionEvent $event
  55.      */
  56.     public function onKernelException(ExceptionEvent $event)
  57.     {
  58.         $exception $event->getThrowable();
  59.         if ($exception instanceof SubscriptionExpiredException) {
  60.             $event->setResponse(new RedirectResponse($this->urlGenerator->generate('payment.widget')));
  61.             return;
  62.         }
  63.         if ($exception instanceof IBaseException) {
  64.             $event->setResponse($this->responseBuilder->buildExceptionResponse($exception));
  65.             return;
  66.         }
  67.         if ($exception instanceof AccessDeniedExceptionUserLoginAttempt) {
  68.             $this->session->getFlashBag()->add('danger'$exception->getMessage());
  69.             $event->setResponse(new RedirectResponse($this->urlGenerator->generate('fos_user_security_login')));
  70.             return;
  71.         }
  72.         if ($exception instanceof RedirectToRoute) {
  73.             $event->setResponse(new RedirectResponse($this->urlGenerator->generate($exception->getRoute())));
  74.             return;
  75.         }
  76.         $this->logger->error('Exception occurred: ' $exception->getMessage(), [
  77.             'exception' => $exception,
  78.             'trace'     => $exception->getTraceAsString(),
  79.         ]);
  80.         if ($exception instanceof UnexpectedException) {
  81.             $event->setResponse($this->responseBuilder->buildExceptionResponse(new BaseException($exception->getMessage())));
  82.             return;
  83.         }
  84.     }
  85. }