实施自定义缓存标签


14

我想在D8中使用新的缓存标记来帮助保持不同类型(实体,节点,块等)的相关内容同步。但是通过阅读此功能的当前可用文档,我不了解如何在创建/更新内容项时将自己的缓存标签添加到内容项中。

例如,当创建类型为Store的新节点时,我想添加缓存标记location:new_york_123,并为aa块添加相同的标记。然后,如果将New York 123位置的显示名称更改为SoHo,则可以使缓存标记无效,并更新所有相关内容。


1
所有实体都已经具有自动失效的缓存标签(例如node:123)。因此,如果您只是创建/更新和显示节点,则无需执行任何操作,它应该可以正常工作。
贝尔迪尔

创建/更新后,将需要查询以查找所有相关类型的内容(节点,块,实体),然后从每个缓存表中将其清除。如果使用单个自定义缓存标签来标识内容项的关系,则只需要使该标签无效即可清除那些相关项的缓存。
LittleCoding

我不明白您的意思和结构。标签在使用时被添加。如果需要更改缓存节点,则应将缓存标签添加到任何渲染元素(如块)中,例如块。如果您使用标准机制来显示实体,那么情况可能已经如此。如果它不起作用,则需要与代码共享更详细的信息,以了解您到底在做什么。
贝尔迪尔

缓存标签用户:{ID}可能会无效,以触发与该用户相关的所有内容的缓存清除。相同的想法,但带有自定义缓存标记。
LittleCoding

Answers:


13

这是如何在我尝试过并起作用的自定义块的上下文中使用缓存标签的方法,但我认为它适用于其他上下文

使用默认的drupal标签

您可以在构建数组中指定,cache > tags > node_list并且当更改任何NODE时该块内容将无效(刷新),而您无需执行任何其他操作

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['node_list'], //invalidate when any node updates
            //'tags' => ['node:1','term:2'], //invalidate when node 1 or term 2 updates
        ],
    );
}

或者,您可以输入一个或多个节点/术语/用户ID,以使特定节点或术语上的阵列无效,如上面的代码注释所示。注意:您可以根据需要混合和匹配节点,术语,用户和自定义标签。

使用自己的标签

如果您想用自己的方式清除构建数组,请在构建数组中添加自定义唯一标记(任何唯一字符串都可以)

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['MY_CUSTOM_UNIQUE_TAG'],
        ],
    );
}

并在您的自定义代码逻辑调用中invalidateTags使用您自己的标签

function MY_MODULE_custom_clear_cache_logic(){ 
    ...
    \Drupal\Core\Cache\Cache::invalidateTags(array('MY_CUSTOM_UNIQUE_TAG'));        

如果您想了解有关Drupal 8缓存内部的更多信息


2
我认为理想情况下,您应该使用cache_tags.invalidator服务而不是直接引用类。
安迪(Andy)
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.