vendor/lightbulb/symfony-common/src/EventSubscriber/ApiErrorResponseSubscriber.php line 44

Open in your IDE?
  1. <?php
  2. namespace Lightbulb\Symfony\EventSubscriber;
  3. use Lightbulb\Symfony\Exception\ApiErrorException;
  4. use Lightbulb\Symfony\HttpFoundation\Response\AbstractErrorResponse;
  5. use Lightbulb\Symfony\HttpFoundation\Response\ErrorResponseFactory;
  6. use Psr\Log\LoggerInterface;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  9. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. class ApiErrorResponseSubscriber implements EventSubscriberInterface
  12. {
  13.     private LoggerInterface $logger;
  14.     /**
  15.      * ApiErrorResponseSubscriber constructor.
  16.      *
  17.      * @param LoggerInterface $logger
  18.      */
  19.     public function __construct(LoggerInterface $logger)
  20.     {
  21.         $this->logger $logger;
  22.     }
  23.     /**
  24.      * {@inheritDoc}
  25.      */
  26.     public static function getSubscribedEvents(): array
  27.     {
  28.         return [
  29.             KernelEvents::RESPONSE => 'onKernelResponse',
  30.             KernelEvents::EXCEPTION => 'onKernelException',
  31.         ];
  32.     }
  33.     /**
  34.      * Convert non standardized error responses to standardized.
  35.      *
  36.      * @param ResponseEvent $event
  37.      */
  38.     public function onKernelResponse(ResponseEvent $event): void
  39.     {
  40.         if (in_array('application/json'$event->getRequest()->getAcceptableContentTypes())) {
  41.             $response $event->getResponse();
  42.             if (false === $response->isSuccessful() && (false === $response instanceof AbstractErrorResponse)) {
  43.                 $event->setResponse(ErrorResponseFactory::createFromResponse($response));
  44.             }
  45.         }
  46.     }
  47.     /**
  48.      * Sets a standardized error response on throwable.
  49.      *
  50.      * @param ExceptionEvent $event
  51.      */
  52.     public function onKernelException(ExceptionEvent $event): void
  53.     {
  54.         $this->logger->error($event->getThrowable()->getMessage());
  55.         $this->logger->debug($event->getThrowable()->getTraceAsString());
  56.         if ($event->getThrowable() instanceof ApiErrorException) {
  57.             $event->setResponse($event->getThrowable()->getErrorResponse());
  58.         } elseif (in_array('application/json'$event->getRequest()->getAcceptableContentTypes())) {
  59.             $event->setResponse(
  60.                 ErrorResponseFactory::createFromThrowable($event->getThrowable())
  61.             );
  62.         }
  63.     }
  64. }