Впровадження спеціальних тегів кеша


14

Я хотів би використовувати нове тегування кешу в D8, щоб допомогти синхронізувати пов'язаний вміст різних типів (сутностей, вузлів, блоків тощо). Але, читаючи наявну в даний час документацію цієї функції, я не розумію, як додати власний тег кеша до елементів вмісту під час створення / оновлення зазначених елементів.

Наприклад, створюючи новий вузол типу Store, я хотів би додати розташування тегу кеша: new_york_123 та те саме для блоку aa. Тоді, якщо я змінив ім'я відображення місцезнаходження Нью-Йорк 123 на SoHo, я міг би визнати недійсним тег кешу та оновити весь відповідний вміст.


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


2
Я думаю, що в ідеалі ви б скористалися cache_tags.invalidatorпослугою, а не посиланням на клас безпосередньо.
Енді,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.