src/EventListener/RequestListener.php line 69

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  5. use Symfony\Component\HttpKernel\KernelEvents;
  6. use Symfony\Component\HttpKernel\Controller\ErrorController;
  7. use Symfony\Component\HttpKernel\HttpKernelInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\Security\Core\Security;
  10. use Symfony\Component\Security\Http\Event\LogoutEvent;
  11. use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
  12. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  13. use App\Exception\InactiveUserException;
  14. use App\Controller\UserController;
  15. use App\Controller\AdministratorController;
  16. use App\Controller\AdminOwnerController;
  17. use App\Controller\SuperAdminController;
  18. use App\Security\RoleSwitcher;
  19. // Note: this is actually a subscriber, not a listener
  20. class RequestListener implements EventSubscriberInterface
  21. {
  22.     private $entityManager;
  23.     private $security;
  24.     private $urlGenerator;
  25.     
  26.     public function __construct(EntityManagerInterface $emSecurity $securityUrlGeneratorInterface $urlGenerator) {
  27.         $this->entityManager $em;
  28.         $this->security $security;
  29.         $this->urlGenerator $urlGenerator;
  30.     }
  31.     public function onKernelController(ControllerEvent $event)
  32.     {
  33.         $user $this->security->getUser();
  34.         $securityToken $this->security->getToken();
  35.         $controller $event->getController();
  36.         if (is_array($controller)) $controller $controller[0];
  37.         if ($controller instanceof ErrorController) return;
  38.         if ($user !== null && ! $user->isActive()) {
  39.             $this->security->getToken()->setAuthenticated(false);
  40.             throw new InactiveUserException("La tua utenza รจ stata disattivata");
  41.         }
  42.         //set last activity for users
  43.         if ($event->getRequestType() === HttpKernelInterface::MAIN_REQUEST && $controller instanceof UserController && $user !== null && ! $securityToken instanceof SwitchUserToken) {
  44.             $user->setLastActivity(new \DateTime());
  45.             $this->entityManager->flush();
  46.         } 
  47.         
  48.         //set active role in session
  49.         if ($user !== null && $event->getRequestType() === HttpKernelInterface::MAIN_REQUEST) {
  50.             $switcher $event->getRequest()->getSession()->get('roleSwitcher');
  51.             if ($switcher === null) {
  52.                 $switcher = new RoleSwitcher();
  53.                 $event->getRequest()->getSession()->set('roleSwitcher',$switcher);
  54.             }
  55.             if ($controller instanceof UserController) {
  56.                 $switcher->setActiveRole(RoleSwitcher::USER);
  57.             } elseif ($controller instanceof AdministratorController || $controller instanceof AdminOwnerController) {
  58.                 $switcher->setActiveRole(RoleSwitcher::ADMIN);
  59.             } elseif ($controller instanceof SuperAdminController) {
  60.                 $switcher->setActiveRole(RoleSwitcher::SUPER_ADMIN);
  61.             }
  62.         }
  63.     }
  64.     
  65.     public function onLogout(LogoutEvent $event)
  66.     {
  67.         $user $event->getToken()->getUser();
  68.         $user->setLastActivity(null);
  69.         $this->entityManager->flush();
  70.     }
  71.     public static function getSubscribedEvents()
  72.     {
  73.         return [
  74.             KernelEvents::CONTROLLER => 'onKernelController',
  75.             LogoutEvent::class => 'onLogout',
  76.         ];
  77.     }    
  78. }