src/EventSubscriber/ApiExceptionSubscriber.php line 40

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Psr\Log\LoggerInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use Symfony\Contracts\Translation\TranslatorInterface;
  9. class ApiExceptionSubscriber implements EventSubscriberInterface
  10. {
  11.     private $translator;
  12.     /**
  13.      * @var LoggerInterface
  14.      */
  15.     private $apiLogger;
  16.     public function __construct(TranslatorInterface $translatorLoggerInterface $apiLogger)
  17.     {
  18.         $this->translator $translator;
  19.         $this->apiLogger $apiLogger;
  20.     }
  21.     public static function getSubscribedEvents()
  22.     {
  23.         // return the subscribed events, their methods and priorities
  24.         return [
  25.             KernelEvents::EXCEPTION => 'onException',
  26.         ];
  27.     }
  28.     /**
  29.      * Handle Exception body response for Api calls
  30.      *
  31.      * @param ExceptionEvent $event
  32.      */
  33.     public function onException(ExceptionEvent $event)
  34.     {
  35.         // Get exception
  36.         $exception $event->getThrowable();
  37.         // Check for API excepion only
  38.         if (get_class($exception) !== 'App\Exception\ApiException'){
  39.             return;
  40.         }
  41.         // Prepare Json response
  42.         $responseData = [
  43.             'error' => true,
  44.             'code' => $exception->getCode(),
  45.             'type' => $exception->getErrorType(),
  46.             'message' => $this->translator->trans($exception->getMessage(), [], 'api'),
  47.             'extraData' => $exception->getExtraData(),
  48.         ];
  49.         $this->apiLogger->error(json_encode(array_merge($responseData, ['request' => $event->getRequest()->getContent()])));
  50.         $response = new JsonResponse($responseData);
  51.         $response->headers->set('Content-Type''application/problem+json');
  52.         $event->setResponse($response);
  53.     }
  54. }