Drupal 8 cookie缓存问题

时间:2016-11-22 14:42:22

标签: caching drupal drupal-7 drupal-8

我有一个drupal 8站点,它动态地设置了一个cookie值'Drupal_visitor_country'。但是这个值正在缓存,我无法在页面刷新期间正确检索它。

我在theme_preprocess_menu函数上使用此值,但它始终返回缓存的cookie值而不是实际值。有什么方法可以克服这种情况。

任何帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:2)

对我来说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缓存之前执行。 最好从页面缓存开始:

请注意,在中间件处理期间,Drupal可能无法完全自举,某些功能可能不存在。

谢谢Mario Vercellotti指出我正确的方向!

答案 1 :(得分: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;
  }
}