<?php
namespace App\EventListener;
use App\Entity\User;
use App\Repository\SystemActionRepository;
use App\Security\Voter\UserVoter;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
use Symfony\Component\Security\Core\Security;
class RequestListener
{
private SystemActionRepository $systemActionRepository;
private Security $security;
private RouterInterface $router;
private EntityManagerInterface $em;
public function __construct(
SystemActionRepository $systemActionRepository,
Security $security,
RouterInterface $router,
EntityManagerInterface $em
)
{
$this->systemActionRepository = $systemActionRepository;
$this->security = $security;
$this->router = $router;
$this->em = $em;
}
public function onKernelRequest(RequestEvent $event)
{
if (!$event->isMasterRequest()) {
// don't do anything if it's not the master request
return;
}
/** @var User $user */
$user = $this->security->getUser();
if(!$user) {
// only for authorised users
return;
}
// request identificator
$request = $event->getRequest();
$requestId = (new \Monolog\Processor\UidProcessor(16))->getUid();uniqid('req_', true);
$request->attributes->set('request_id', $requestId);
$urlCodexIndex = $this->router->generate('app_codex_index');
if (
$this->security->isGranted(UserVoter::SHOW_FULLY_STUDENT)
&& !$user->getIsCheckCodex()
&& $event->getRequest()->getPathInfo() !== $this->router->generate('app_codex_index')
) {
$event->setResponse(new RedirectResponse($urlCodexIndex));
}
if (!($this->security->getToken() instanceof SwitchUserToken)) {
$user->setLastActivityAt(new DateTime());
}
$this->em->persist($user);
$this->em->flush();
$this->systemActionRepository->saveByRequest($event->getRequest(), $this->security);
}
}