lib/Ntl/User/src/EventSubscriber/NtlUserEventSubscriber.php line 62

  1. <?php
  2. namespace Ntl\UserBundle\EventSubscriber;
  3. use Doctrine\DBAL\Exception\DriverException;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Ntl\UserBundle\Entity\NtlApiUser as User;
  6. use Psr\Log\LoggerInterface;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  11. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  12. use Symfony\Component\Security\Http\Event\LogoutEvent;
  13. /**
  14.  * Logout action hook.
  15.  */
  16. class NtlUserEventSubscriber implements EventSubscriberInterface
  17. {
  18.     /**
  19.      * Loging service.
  20.      */
  21.     private LoggerInterface $logger;
  22.     /**
  23.      * Doctrine ntity manager service.
  24.      */
  25.     private EntityManagerInterface $entityManager;
  26.     /**
  27.      * URL generation service.
  28.      */
  29.     private UrlGeneratorInterface $urlGenerator;
  30.     /**
  31.      * Constructor.
  32.      */
  33.     public function __construct(EntityManagerInterface $emLoggerInterface $loggerUrlGeneratorInterface $urlGenerator)
  34.     {
  35.         $this->logger $logger;
  36.         $this->entityManager $em;
  37.         $this->urlGenerator $urlGenerator;
  38.     }
  39.     /**
  40.      * Configure event subscriptions.
  41.      */
  42.     public static function getSubscribedEvents(): array
  43.     {
  44.         return [
  45.             ExceptionEvent::class => 'onKernelException',
  46.             LogoutEvent::class => 'onLogout',
  47.         ];
  48.     }
  49.     /**
  50.      * Kernel exception hook.
  51.      *
  52.      * @return void
  53.      */
  54.     public function onKernelException(ExceptionEvent $event)
  55.     {
  56.         // You get the exception object from the received event
  57.         $exception $event->getThrowable();
  58.         if ($exception instanceof DriverException) {
  59.             // Customize your response object to display the exception details
  60.             $response = new Response();
  61.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  62.             $this->logger->error('Driver exception occured', [$exception->getMessage()]);
  63.             // handling the default target path
  64.             // @TODO redirect after successfull login through configuration parameter
  65.             if ($event->getRequest()->isXmlHttpRequest()) {
  66.                 $response = new JsonResponse([
  67.                     'result' => false,
  68.                     'message' => $exception->getMessage(),
  69.                 ],Response::HTTP_BAD_REQUEST);
  70.             }
  71.             // sends the modified response object to the event
  72.             $event->setResponse($response);
  73.         }
  74.     }
  75.     /**
  76.      * Logout hook.
  77.      *
  78.      * @return void
  79.      */
  80.     public function onLogout(LogoutEvent $event)
  81.     {
  82.         if ($event->getToken()) {
  83.             $this->logger->info('User logout - closing NtlApi session', [$event->getToken()->getUserIdentifier()]);
  84.             $this->entityManager->getRepository(User::class)->ntlapiCloseSession();
  85.         }
  86.         if ($event->getRequest()->isXmlHttpRequest()) {
  87.             $response = new JsonResponse([
  88.                 'redirectTo' => $this->urlGenerator->generate('app_index'),
  89.             ]);
  90.             $event->setResponse($response);
  91.         }
  92.     }
  93. }