我有一个drupal 8站点,它动态地设置了一个cookie值'Drupal_visitor_country'。但是这个值正在缓存,我无法在页面刷新期间正确检索它。
我在theme_preprocess_menu函数上使用此值,但它始终返回缓存的cookie值而不是实际值。有什么方法可以克服这种情况。
任何帮助将不胜感激。
由于
答案 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;
}
}