src/EventListener/ExceptionListener.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Exception\JsonHttpException;
  4. use Psr\Log\LoggerInterface;
  5. use Symfony\Component\Debug\Exception\ContextErrorException;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  8. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  9. class ExceptionListener
  10. {
  11.     /**
  12.      * @var LoggerInterface
  13.      */
  14.     private $logger;
  15.     public function __construct(LoggerInterface $logger)
  16.     {
  17.         $this->logger $logger;
  18.     }
  19.     public function onKernelException(ExceptionEvent $event)
  20.     {
  21.         $request $event->getRequest();
  22.         $exception $event->getThrowable();
  23.         if ($exception instanceof JsonHttpException) {
  24.             $errorData = [
  25.                 'error' => [
  26.                     'code' => $exception->getStatusCode(),
  27.                     'message' => $exception->getMessage(),
  28.                 ]
  29.             ];
  30.             if (($data $exception->getData())) {
  31.                 if (isset($data['code'])) {
  32.                     $errorData['error']['code'] = $data['code'];
  33.                 }
  34.             }
  35.             $response = new JsonResponse($errorData);
  36.             $event->setResponse($response);
  37.             $this->logger->error($exception->getMessage(), $errorData);
  38.             return $event;
  39.         }
  40.         if ($exception && $exception instanceof ContextErrorException) {
  41.             $errorData = [
  42.                 'error' => [
  43.                     'code' => 1,
  44.                     'message' => $exception->getMessage(),
  45.                 ]
  46.             ];
  47.             $response = new JsonResponse($errorData);
  48.             $event->setResponse($response);
  49.             $this->logger->error($exception->getMessage(), $errorData);
  50.             return $event;
  51.         }
  52.         if ((bool) $exception && preg_match('/^\/api\/v\d+(\.{1}\d+)?\//'$request->getPathInfo())
  53.             && $exception instanceof HttpExceptionInterface && $exception->getStatusCode() == 403) {
  54.             $errorData = [
  55.                 'error' => [
  56.                     'code' => $exception->getStatusCode(),
  57.                     'message' => 'Access denied',
  58.                 ]
  59.             ];
  60.             $response = new JsonResponse($errorData);
  61.             $event->setResponse($response);
  62.             $this->logger->error($exception->getMessage(), $errorData);
  63.             return $event;
  64.         }
  65.         return $event;
  66.     }
  67. }