src/EventListener/ExceptionListener.php line 25

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventListener;
  4. use ApiPlatform\Symfony\Validator\Exception\ValidationException;
  5. use App\Entity\Admin\LocaleInterface;
  6. use App\Generator\Logger\ApiLoggerExceptionGenerator;
  7. use App\Helper\Response\ResponseInterface as CustomResponseInterface;
  8. use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. #[AsEventListener(priority135)]
  13. class ExceptionListener
  14. {
  15.     public function __construct(
  16.         private TranslatorInterface $translator,
  17.         private ApiLoggerExceptionGenerator $apiLoggerExceptionGenerator,
  18.     ) {
  19.     }
  20.     public function __invoke(ExceptionEvent $event): void
  21.     {
  22.         $request $event->getRequest();
  23.         $route $request->attributes->get('_route');
  24.         $exception $event->getThrowable();
  25.         if (null === $route || !str_starts_with($route'api_')) {
  26.             return;
  27.         }
  28.         $this->apiLoggerExceptionGenerator->generate($exception);
  29.         if (false === $exception instanceof ValidationException || false === property_exists($exception'constraintViolationList')) {
  30.             return;
  31.         }
  32.         $errors = [
  33.             'detail' => CustomResponseInterface::INVALID_INPUT,
  34.             'violations' => [],
  35.         ];
  36.         $locale $request->headers->get('locale');
  37.         if (null === $locale || false === \in_array($localeLocaleInterface::LOCALEStrue)) {
  38.             $locale LocaleInterface::LOCALE_EN;
  39.         }
  40.         /** @var ValidationException $exception */
  41.         foreach ($exception->getConstraintViolationList() as $violation) {
  42.             $errors['violations'][] = [
  43.                 'property' => $violation->getPropertyPath(),
  44.                 'message' => $this->translator->trans($violation->getMessageTemplate(), $violation->getParameters(), 'validators'$locale),
  45.             ];
  46.         }
  47.         $response = new Response();
  48.         $response->setContent(stripslashes(json_encode($errorsJSON_UNESCAPED_UNICODE)));
  49.         $code === $exception->getCode() ? Response::HTTP_BAD_REQUEST $exception->getCode();
  50.         $response->setStatusCode($code);
  51.         $event->setResponse($response);
  52.     }
  53. }