Рейтинг:0

EventSubscriber для добавления контекста кеша для определенного пути

флаг cn

Я работаю с модулем Mobile Detect, и, насколько я понимаю, нам нужно вручную добавить контекст кеша. mobile_detect_is_mobile чтобы страница кэшировалась по-разному в зависимости от типа пользовательского устройства. Я смог заставить его работать, применив контекст кеша, используя предварительную обработку моего абзаца следующим образом:

функция hook_preprocess_paragraph(&$variables){
    $variables['#cache']['contexts'][] = 'mobile_detect_is_mobile';
}

Хотя мне не нравится идея добавления контекста на уровне предварительной обработки, и я искал более глобальное решение, используя EventSubscriber, который проверяет путь и применяет контекст кеша для определенных путей. Похоже, что контекст кеша не принимается во внимание. Вот мой EventSubscriber:

класс MobileDetectSubscriber реализует EventSubscriberInterface {

    /**
     * @var\Symfony\Component\HttpFoundation\Request
     */
    защищенный $запрос;

    /**
     * @param\Symfony\Component\HttpFoundation\RequestStack $request_stack
     */
    общедоступная функция __construct (RequestStack $ request_stack) {
    $this->request = $request_stack->getCurrentRequest();;
    }

    /**
     * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
     * Событие для обработки.
     */
    публичная функция onRespond (FilterResponseEvent $event) {
        если (!$событие
            ->isMasterRequest()) {
            возвращаться;
        }
        $ответ = $событие
            ->получитьответ();
        if (!$response instanceof CacheableResponseInterface) {
            возвращаться;
        }

        если($this->request->getRequestUri() == "/"){ 
            $mobile_detect = новые CacheableMetadata();
            $mobile_detect->setCacheContexts(['mobile_detect_is_mobile']);
            $response->addCacheableDependency($mobile_detect);
        }
    }

    /**
     * @возвратный массив
     * Массив определений слушателей событий.
     */
    общедоступная статическая функция getSubscribedEvents() {
        // Приоритет 5, чтобы он выполнялся до FinishResponseSubscriber, но после
        // подписчики событий, которые добавляют соответствующие метаданные кэшируемости (которые
        // иметь приоритет 10). Это условно, поэтому нужно бежать за ними.
        $events[KernelEvents::RESPONSE][] = ['onRespond', 5];
        вернуть $события;
    }
}

Что мне не хватает?

miststudent2011 avatar
флаг fr
Вы тоже написали services.yml?
Рейтинг:2
флаг cn

Добавление контекста кеша к ответу не является более глобальным. Это совсем наоборот.Только если вы поместите контекст кэша в тот же элемент рендеринга, который зависит от этого контекста, он может быть объединен со всеми затронутыми уровнями кэширования. В этом примере контекст абзаца будет объединен с родительским узлом, а затем со страницей. Абзац и узел также могут находиться в блоке или представлении. Всем этим элементам нужен этот контекст кеша.

Добавление контекста кеша в хук предварительной обработки действительно является последним средством в процессе рендеринга шаблона. В Drupal есть дополнительный код, проверяющий верхнюю часть $variables хука предварительной обработки и объединяющий метаданные кеша с шаблоном.

Однако идея метаданных кеша состоит в том, чтобы добавить их непосредственно в массив сборки при создании содержимого в коде, чтобы они могли распространяться на все задействованные шаблоны. Это работает также при рефакторинге кода для функции, используемой в разных местах. Например, функция Twig:

$сборка = [];
// строим контент
$build['#cache']['contexts'][] = 'mobile_detect_is_mobile';
// либо возвращаем массив сборки для рендеринга в {{ }}
вернуть $сборка;
// или если ваша функция Twig не возвращает $build, всплывает хотя бы метаданные 
// визуализируя его внутри функции Twig
\Drupal::service('рендерер')->render($build);

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.