src/EventSubscriber/LogoutSubscriber.php line 25

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\BackUser;
  4. use App\Entity\BackUserLog;
  5. use App\Service\TimezoneService;
  6. use DateTime;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\Security\Http\Event\LogoutEvent;
  10. class LogoutSubscriber implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * LogoutSubscriber constructor.
  14.      */
  15.     public function __construct(
  16.         protected EntityManagerInterface $manager,
  17.         protected HistorySubscriber $historySubscriber,
  18.         protected TimezoneService $timezoneService
  19.     ) {
  20.     }
  21.     public function onLogout(LogoutEvent $logoutEvent): void
  22.     {
  23.         $request $logoutEvent->getRequest();
  24.         $token   $logoutEvent->getToken();
  25.         $this->manager->getEventManager()->removeEventListener(
  26.             [
  27.                 'postRemove',
  28.                 'postPersist',
  29.                 'postUpdate',
  30.             ],
  31.             $this->historySubscriber
  32.         );
  33.         if ($token) {
  34.             /** @var BackUser $user */
  35.             $user $token->getUser();
  36.             if ($user instanceof BackUser) {
  37.                 $ip $request->server->get('REMOTE_ADDR');
  38.                 $this->timezoneService->set($user);
  39.                 $userLog = new BackUserLog();
  40.                 $userLog->setType(BackUserLog::TYPE_LOGOUT);
  41.                 $userLog->setUser($user);
  42.                 $userLog->setIp($ip);
  43.                 $userLog->setDate(new DateTime());
  44.                 $this->manager->persist($userLog);
  45.                 $this->manager->flush();
  46.             }
  47.         }
  48.     }
  49.     /**
  50.      * @return array<string, mixed>
  51.      */
  52.     public static function getSubscribedEvents(): array
  53.     {
  54.         return [LogoutEvent::class => 'onLogout'];
  55.     }
  56. }