Как выполнить фрагмент кода на каждой странице? - PullRequest
0 голосов
/ 24 июня 2019

В настоящее время я создаю веб-сайт с использованием 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 или использую ссылки на веб-странице. Но когда я использую кнопку «Назад» браузера, отображается кэшированная версия страницы, и событие НЕ запускается, что приводит к тому, что код не выполняется.

Как выполнить фрагмент кода на каждой странице?

Редактировать: я не пытаюсь полностью отключить кеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...