src/EventSubscriber/ApiExceptionSubscriber.php line 27

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use App\Exception\Api\ApiException;
  5. use Psr\Log\LoggerInterface;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. class ApiExceptionSubscriber implements EventSubscriberInterface
  11. {
  12.     public function __construct(private readonly LoggerInterface $logger)
  13.     {
  14.     }
  15.     public static function getSubscribedEvents(): array
  16.     {
  17.         return [
  18.             KernelEvents::EXCEPTION => 'onKernelException',
  19.         ];
  20.     }
  21.     public function onKernelException(ExceptionEvent $exceptionEvent): void
  22.     {
  23.         $exception $exceptionEvent->getThrowable();
  24.         if (!$exception instanceof ApiException) {
  25.             return;
  26.         }
  27.         $this->logger->notice($exception->getMessage(), [
  28.             'exception' => $exception,
  29.         ]);
  30.         $response = new JsonResponse();
  31.         $response->setStatusCode($exception->getStatusCode());
  32.         $response->setData([
  33.             'message' => $exception->getMessage(),
  34.             'errors' => $exception->getErrors(),
  35.         ]);
  36.         $exceptionEvent->setResponse($response);
  37.     }
  38. }