- <?php
- namespace App\EventListener;
- use Twig\Environment;
- use Symfony\Component\HttpFoundation\Response;
- use Symfony\Component\HttpKernel\KernelEvents;
- use Symfony\Component\HttpKernel\Event\ExceptionEvent;
- use Symfony\Component\Security\Core\User\UserInterface;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- use Symfony\Component\EventDispatcher\EventSubscriberInterface;
- use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
- class ExceptionSubscriber implements EventSubscriberInterface
- {
-     private $user;
-     private $twig;
-     private $container;
-     public function __construct(Environment $twig, ContainerInterface $container, UserInterface $user = null)
-     {
-         $this->user = $user;
-         $this->twig = $twig;
-         $this->container = $container;
-     }
-     public static function getSubscribedEvents()
-     {
-         return [
-             KernelEvents::EXCEPTION => [
-                 ['onKernelException', 10]
-             ]
-         ];
-     }
-     public function onKernelException(ExceptionEvent $event)
-     {
-         // We only need to suppress errors in production environment
-         if ($this->container->get('kernel')->getEnvironment() != 'prod') {
-             return;
-         }
-         // @TODO: We need to take into account the response type as well (html, xml, json)
-         $exception = method_exists($event, 'getThrowable') ? $event->getThrowable() : $event->getException();
-         if ($exception->getCode() == 403) {
-             // On forbidden exception, we need to either:
-             //         a) If user session is set, display forbidden page
-             //         b) If user session is not set, redirect to login page
-             if (!empty($this->container->get('security.token_storage')->getToken()->getUser()) && $this->container->get('security.token_storage')->getToken()->getUser() != "anon.") {
-                 $template = $this->twig->render('errors/error.html.twig', [
-                     'code' => 403,
-                     'message' => 'Access Forbidden',
-                     'description' => 'You are not authorized to access this page.',
-                 ]);
-     
-                 $event->setResponse(new Response($template, 403));
-             }
-         } else {
-             if ($exception instanceof NotFoundHttpException || $exception->getCode() == 404) {
-                 $template = $this->twig->render('errors/error.html.twig', [
-                     'code' => 404,
-                     'message' => 'Page not Found',
-                     'description' => 'We were not able to find the page you are looking for.',
-                 ]);
-     
-                 $event->setResponse(new Response($template, 404));
-             } else {
-                 $template = $this->twig->render('errors/error.html.twig', [
-                     'message' => 'Internal Server Error',
-                     'code' => 500,
-                     'description' => 'Something has gone wrong on the server. Please try again later.',
-                 ]);
-     
-                 $event->setResponse(new Response($template, 500));
-             }
-         }
-     }
- }
-