src/EventListener/ControlPanel/ControlpanelExceptionListener.php line 47

Open in your IDE?
  1. <?php
  2. namespace App\EventListener\ControlPanel;
  3. use App\Application\DTO\JsonApi\Error;
  4. use App\Application\DTO\JsonApi\JsonApiDocument;
  5. use App\Application\Service\Factory\SerializerFactory;
  6. use App\Application\Service\Helper\ControlPanelLogWriterService;
  7. use App\Application\Service\Helper\TranslatorService;
  8. use App\Entity\System\Language;
  9. use App\Exception\ControlPanel\ControlpanelException;
  10. use App\Exception\ControlPanel\ControlPanelNotFoundException;
  11. use App\Exception\ControlPanel\JsonApiException;
  12. use App\Model\Controlpanel\Response\WebJsonApiResponse;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  16. use Symfony\Component\Serializer\SerializerInterface;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. class ControlpanelExceptionListener
  19. {
  20.     private TranslatorInterface $translator;
  21.     private ControlPanelLogWriterService $logWriterService;
  22.     private SerializerInterface $serializer;
  23.     private RequestStack $requestStack;
  24.     public function __construct(
  25.         TranslatorInterface $translator,
  26.         ControlPanelLogWriterService $logWriterService,
  27.         SerializerFactory $serializerFactory,
  28.         RequestStack $requestStack
  29.     ) {
  30.         $this->translator $translator;
  31.         $this->logWriterService $logWriterService;
  32.         $this->serializer $serializerFactory::getWebJsonAPISerializer();
  33.         $this->requestStack $requestStack;
  34.     }
  35.     /**
  36.      * @throws \App\Exception\JsonApiException
  37.      * @throws \Exception
  38.      */
  39.     public function onKernelException(ExceptionEvent $exceptionEvent): void
  40.     {
  41.         $exception $exceptionEvent->getThrowable();
  42.         $request $exceptionEvent->getRequest();
  43.         $isoCode $this->requestStack->getSession()->get('lang'Language::ENGLISH_ISO);
  44.         if ($exception instanceof ControlPanelNotFoundException) {
  45.             $exceptionEvent->setResponse(new Response(''Response::HTTP_NOT_FOUND));
  46.         }
  47.         if ($exception instanceof ControlpanelException) {
  48.             foreach ($exception->getErrors() as $error) {
  49.                 $error->setTitle($this->translator->trans($error->getTitle(), [], TranslatorService::MESSAGES_DOMAIN$isoCode));
  50.             }
  51.             $jsonApiDocument = new JsonApiDocument(null$exception->getErrors());
  52.             $serializedResponse $this->serializer->serialize($jsonApiDocument'json');
  53.             $this->logWriterService->logResponse($request->getRealMethod(), $request->attributes->get('_route'), $serializedResponseControlPanelLogWriterService::WARNING);
  54.             $exceptionEvent->setResponse(new WebJsonApiResponse($jsonApiDocument$exception->getStatusCode(), ['Content-Type' => 'application/vnd.api+json']));
  55.         }
  56.         if ($exception instanceof JsonApiException) {
  57.             $title $this->translator->trans($exception->getMessage(), [], TranslatorService::MESSAGES_DOMAIN$isoCode);
  58.             $status = (string)Response::HTTP_BAD_REQUEST;
  59.             $error = new Error(nullnullnull$status$title);
  60.             $jsonApiDocument = new JsonApiDocument(null, [$error]);
  61.             $serializedResponse $this->serializer->serialize($jsonApiDocument'json');
  62.             $this->logWriterService->logResponse($request->getRealMethod(), $request->attributes->get('_route'), $serializedResponseControlPanelLogWriterService::WARNING);
  63.             $exceptionEvent->setResponse(new WebJsonApiResponse($jsonApiDocumentResponse::HTTP_BAD_REQUEST, ['Content-Type' => 'application/vnd.api+json']));
  64.         }
  65.     }
  66. }