src/EventListener/ApiExceptionListener.php line 36

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventListener;
  4. use App\Model\ErrorResponse;
  5. use App\Request\RequestAttributes;
  6. use App\Services\System\ExceptionMapping;
  7. use App\Services\System\ExceptionMappingResolver;
  8. use Psr\Log\LoggerInterface;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  12. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  13. use Symfony\Component\Serializer\SerializerInterface;
  14. class ApiExceptionListener
  15. {
  16.     private LoggerInterface $logger;
  17.     private ExceptionMappingResolver $mappingResolver;
  18.     private SerializerInterface $serializer;
  19.     public function __construct(
  20.         ExceptionMappingResolver $mappingResolver,
  21.         LoggerInterface $logger,
  22.         SerializerInterface $serializer
  23.     ) {
  24.         $this->mappingResolver $mappingResolver;
  25.         $this->logger $logger;
  26.         $this->serializer $serializer;
  27.     }
  28.     public function __invoke(ExceptionEvent $event): void
  29.     {
  30.         $isApiZone $event->getRequest()->attributes->get(RequestAttributes::API_ZONEtrue);
  31.         if (!$isApiZone) {
  32.             return;
  33.         }
  34.         $throwable $event->getThrowable();
  35.         $mapping $this->mappingResolver->resolve(\get_class($throwable));
  36.         if (null === $mapping) {
  37.             $mapping = new ExceptionMapping(Response::HTTP_INTERNAL_SERVER_ERROR);
  38.         }
  39.         if ($mapping->getCode() >= Response::HTTP_INTERNAL_SERVER_ERROR || $mapping->isLoggable()) {
  40.             $this->logger->error($throwable->getMessage(), [
  41.                 'trace' => $throwable->getTraceAsString(),
  42.                 'previous' => null !== $throwable->getPrevious() ? $throwable->getPrevious()->getMessage() : '',
  43.             ]);
  44.         }
  45.         $message $mapping->isHidden() ? Response::$statusTexts[$mapping->getCode()] : $throwable->getMessage();
  46.         $data $this->serializer->serialize(new ErrorResponse($message), JsonEncoder::FORMAT);
  47.         $response = new JsonResponse($data$mapping->getCode(), [], true);
  48.         $event->setResponse($response);
  49.     }
  50. }