2016-11-22 4 views
0

У меня есть сайт drupal 8, который динамически устанавливает значение cookie 'Drupal_visitor_country'. Но это значение кэшируется, и я не могу его правильно восстановить во время обновления страницы.Проблема с файлом cookie Drupal 8

Я использую это значение для функции theme_preprocess_menu, но он всегда возвращает значение кэшированного cookie вместо фактического значения. Есть ли способ преодолеть эту ситуацию.

Любая помощь будет оценена по достоинству.

Благодаря

ответ

0

Используйте EventSubscriber: $events[KernelEvents::REQUEST][] = ['onRequest'];

/** 
* @file 
* Contains \Drupal\kvantstudio\EventSubscriber\KvantstudioEventSubscriber. 
*/ 

namespace Drupal\kvantstudio\EventSubscriber; 

use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 

/** 
* Event Subscriber KvantstudioEventSubscriber. 
*/ 
class KvantstudioEventSubscriber implements EventSubscriberInterface { 

    /** 
    * Code that should be triggered on event specified 
    */ 
    public function onRequest(GetResponseEvent $event) { 
    if (!isset($_COOKIE['Drupal_visitor_userHash'])) { 
     $uuid = \Drupal::service('uuid'); 
     user_cookie_save(['userHash' => 'user-' . $uuid->generate()]); 
    } 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public static function getSubscribedEvents() { 
    $events = [];  
    $events[KernelEvents::REQUEST][] = ['onRequest']; 
    return $events; 
    } 
} 
+0

У меня есть похожий сценарий, но события KernelEvents :: REQUEST, похоже, выполняются только на не кэшированных страницах, поэтому он мне не помогает. – Rax

0

Для меня Middleware API сделал трюк. Смотри ниже.

Не работает: Пробовал использовать KernelEvents - они не срабатывали при запросе страницы. KernelEvents::REQUEST сделал пожар по запросам активов.

Не работает: Пытался злоупотреблять services.yml, но обнаружил, что на самом деле я не могу исключить страницу здесь.

renderer.config: 
    required_cache_contexts: ['languages:language_interface', 'theme', 'user.permissions', ... ] 

Не работает: Затем я попытался создать свою собственную CacheContext. Выяснилось, что он также не дает возможности для исключения. в лучшем случае вы можете генерировать уникальный кеш для каждой загрузки для определенного узла, но это может убить кеш. How to recognize, discover and create? также: CacheContextInterface

ли работа:Middleware API. Он выполняется до кэширования Drupal. Лучше всего начать с Page Cache:

Помните, что во время обработки промежуточного программного обеспечения Drupal не может быть полностью загружен и некоторые функции могут отсутствовать.

Спасибо Марио Верчеллотти за то, что указали мне вправо!

 Смежные вопросы

  • Нет связанных вопросов^_^