Реализация пользовательских тегов кэша

14

Я хотел бы использовать новую метку кэша в D8, чтобы помочь синхронизировать связанный контент различных типов (сущностей, узлов, блоков и т. Д.). Но, прочитав доступную в настоящее время документацию по этой функции, я не понимаю, как добавить собственный тег кеша к элементам содержимого при создании / обновлении указанных элементов.

Например, при создании нового узла типа Store я хотел бы добавить местоположение тега кеша: new_york_123 и то же самое для блока. Затем, если я изменил отображаемое имя местоположения New York 123 на SoHo, я мог бы сделать недействительным тег кеша и обновить все связанное содержимое.

LittleCoding
источник
1
Все объекты уже имеют тег кеша (например, узел: 123), который автоматически становится недействительным. Так что если вы просто создаете / обновляете и отображаете узлы, вам не нужно ничего делать, это должно просто работать.
Бердир
после создания / обновления потребуется запрос, чтобы найти все связанные типы контента (узлы, блоки, объекты), а затем удалить их из каждой таблицы кеша. Если для идентификации взаимосвязи элементов контента используется один настраиваемый тег кеша, то только этот тег должен быть признан недействительным для очистки кеша этих связанных элементов.
LittleCoding
Я не понимаю, что вы имеете в виду и какова ваша структура. Теги добавляются, когда они используются. Кэшированные теги должны быть добавлены к любому элементу рендеринга, например к блоку, если он должен измениться, если этот узел / объект изменился. Если вы используете стандартные механизмы для отображения сущностей, то, скорее всего, это уже так. Если это не сработает, вам нужно более подробно поделиться с кодом тем, что именно вы делаете.
Бердир
Пользователь тега кеша: {ID} может быть недействительным, чтобы вызвать очистку кеша для всего контента, связанного с этим пользователем. Та же идея, но с пользовательским тегом кеша.
LittleCoding

Ответы:

13

Вот как использовать теги кеша в контексте пользовательских блоков, которые я пробовал и работает, но я думаю, что это применимо к другим контекстам

Использовать тэги drupal по умолчанию

В массиве сборки вы можете указать, cache > tags > node_listи содержимое этого блока станет недействительным (обновленным), когда ЛЮБОЙ УЗЕЛ будет изменен, и с вашей стороны больше ничего не делать

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
        ],
    );
}

В качестве альтернативы вы можете добавить один или несколько идентификаторов узлов / терминов / пользователей, чтобы сделать массив недействительным для определенных узлов или терминов, как показано в комментарии к коду выше. Примечание: вы можете смешивать и сопоставлять узлы, термины, пользователей и пользовательские теги по своему усмотрению.

Используйте свои собственные теги

если вы хотите иметь свой собственный способ очистки массива сборки, добавьте свой собственный уникальный тег в массив сборки (подойдет любая уникальная строка)

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

GiorgosK
источник
2
Я думаю, что в идеале вы должны использовать cache_tags.invalidatorсервис, а не ссылаться на класс напрямую.
Энди