В настоящее время я создаю веб-сайт с использованием Symfony 4 и пытаюсь выполнить фрагмент кода на каждой странице, чтобы я мог отслеживать, какой страницей является текущий пользователь.
Пока я пытался создать EventSubscriber и заставить его слушать KernelEvents::REQUEST
:
<?php
namespace App\EventSubscriber;
use App\Entity\User\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
/**
* Class RouteSubscriber
* @package App\EventSubscriber
*/
class RouteSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface $entityManager
*/
private $entityManager;
/**
* @var TokenStorageInterface $tokenStorage
*/
private $tokenStorage;
/**
* RouteSubscriber constructor.
* @param EntityManagerInterface $entityManager
* @param TokenStorageInterface $tokenStorage
*/
public function __construct(EntityManagerInterface $entityManager, TokenStorageInterface $tokenStorage)
{
$this->entityManager = $entityManager;
$this->tokenStorage = $tokenStorage;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [KernelEvents::REQUEST => 'onKernelRequest'];
}
/**
* @method onKernelRequest
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event): void
{
if (!($event->isMasterRequest()))
{
return;
}
if (!($token = $this->tokenStorage->getToken()))
{
return;
}
if (!($token->isAuthenticated()))
{
return;
}
if (!($user = $token->getUser()))
{
return;
}
if (!($user instanceof User))
{
return;
}
$user->setRoute($event->getRequest()->attributes->get('_route'));
$this->entityManager->persist($user);
$this->entityManager->flush();
}
}
Теперь, это работает, когда я перехожу с одной страницы на другую, когда сам набираю URL или использую ссылки на веб-странице. Но когда я использую кнопку «Назад» браузера, отображается кэшированная версия страницы, и событие НЕ запускается, что приводит к тому, что код не выполняется.
Как выполнить фрагмент кода на каждой странице?
Редактировать: я не пытаюсь полностью отключить кеш.