在哪里为实体添加新的缓存上下文?


9

我无法添加缓存上下文来为drupal 8中的实体工作。特别是我要使用headers:User-Agent。我在以下模块中尝试了多种变体。

 use Drupal\node\NodeInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

 function hook_entity_view_alter(&$build, EntityInterface $entity, EntityViewDisplayInterface $display){
   if($entity->getType() == 'relevant_type'){
    $build['#cache']['contexts'][] = 'headers:User-Agent';
   }

 }

我正在尝试在上下文更改时检查节点访问权限。我也在hook_entity_build_defaults_alter()功能中尝试过。


请注意,缓存上下文不会影响用户具有的节点访问权限。缓存上下文只是在缓存数据时更改。
kiamlaluno

将对hook_node_access中设置的节点访问进行缓存。
ummdorian '16

那是一个不同的缓存容器,而不是用于内容的容器。
kiamlaluno

请参阅实现\ Drupal \ Core \ Cache \ Context \ CacheContextInterface的类

Answers:


6

您确实应该使用hook_entity_build_defaults_alter()。它的文档甚至明确指出:

在drupal_render()中进行缓存检查之前,请更改实体可渲染值。

#cache可渲染数组的键中的值用于确定是否存在用于实体的渲染输出的缓存条目。理想情况下,仅应在此挂钩中更改与缓存有关的值。

它可能对您不起作用,因为您在实现该钩子后忘记了清除渲染缓存。

该挂钩在https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8中调用

另请参阅https://www.drupal.org/developing/api/8/cache/contexts,以获取缓存上下文的概述(它们是什么,如何使用它们,以及核心附带的内容)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.