src/Listener/JsonExceptionListener.php line 46

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Novo SGA project.
  4.  *
  5.  * (c) Rogerio Lino <rogeriolino@gmail.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace App\Listener;
  11. use Novosga\Http\Envelope;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  14. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  15. use Symfony\Component\HttpKernel\KernelInterface;
  16. use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
  17. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  18. use Symfony\Contracts\Translation\TranslatorInterface;
  19. /**
  20.  * JsonExceptionListener
  21.  *
  22.  * @author Rogerio Lino <rogeriolino@gmail.com>
  23.  */
  24. class JsonExceptionListener extends AppListener
  25. {
  26.     /**
  27.      * @var KernelInterface
  28.      */
  29.     private $kernel;
  30.     
  31.     /**
  32.      * @var TranslatorInterface
  33.      */
  34.     private $translator;
  35.     
  36.     public function __construct(KernelInterface $kernelTranslatorInterface $translator)
  37.     {
  38.         $this->kernel     $kernel;
  39.         $this->translator $translator;
  40.     }
  41.     
  42.     public function onKernelException(ExceptionEvent $event)
  43.     {
  44.         if (KernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
  45.             return;
  46.         }
  47.         
  48.         $exception $event->getThrowable();
  49.         $request   $event->getRequest();
  50.         $debug     $this->kernel->getEnvironment() === 'dev';
  51.         
  52.         if ($this->isApiRequest($request)) {
  53.             if ($exception instanceof NotFoundHttpException) {
  54.                 $json = [
  55.                     'code' => 404,
  56.                     'error' => 'Not found',
  57.                 ];
  58.             } else if ($exception instanceof AuthenticationCredentialsNotFoundException) {
  59.                 $json = [
  60.                     'code' => 403,
  61.                     'error' => 'Not authenticated',
  62.                 ];
  63.             } else {
  64.                 $json = [
  65.                     'code' => 400,
  66.                     'error' => $exception->getMessage(),
  67.                 ];
  68.             }
  69.             
  70.             if ($debug) {
  71.                 $json['detail'] = $exception->getTraceAsString();
  72.             }
  73.             
  74.             $response = new JsonResponse($json);
  75.             $event->setResponse($response);
  76.         } else if ($request->isXmlHttpRequest()) {
  77.             $envelope = new Envelope();
  78.             $envelope->exception($exception$debug);
  79.             
  80.             if ($exception instanceof AuthenticationException) {
  81.                 $error $this->translator->trans('session.invalid');
  82.                 $envelope->setSessionStatus('inactive');
  83.                 $envelope->setMessage($error);
  84.             }
  85.             
  86.             $response = new JsonResponse($envelope);
  87.             $event->setResponse($response);
  88.         }
  89.     }
  90. }