Как подстановить кэш в Drupal 8?

8

В Drupal 7 мы привыкли делать это:

cache_clear_all('state:', 'cache', TRUE)

который удалял бы все элементы кеша, которые начинались со строки state:(соответствующие идентификаторы кеша, такие как state:infoи state:nebraska).

Запись изменений по адресу https://www.drupal.org/node/1272696 даже отмечает этот вариант использования в примере Drupal 7, но на самом деле не предоставляет пример того, как его реплицировать в D8.

Похоже, что мы должны использовать теги кеша, что кажется более дорогим преобразованием, учитывая простой вариант использования. Я не вижу подходящих методов, которые могли бы применяться в CacheBackendInterface . Обратите внимание, что речь идет не об удалении всех элементов в корзине кеша, которая явно покрыта deleteAll ().

Дейв Рид
источник

Ответы:

8

Не уверен, почему существующий ответ был удален, это было (почти) правильно.

Очистка кеша удалена Поддерживать его было очень сложно в таких бэкэндах, как redis и memcache, которые не поддерживают подстановочные знаки.

Теги кеша - это замена, и их не так сложно использовать. Вы просто передаете список строк в качестве 4-го аргумента (немного раздражает, что вы должны установить аргумент временной метки по умолчанию, отдельный метод был бы неплох):

\Drupal::cache('default')->set('state:info', $your_data, Cache::PERMANENT, 
['state']);

а затем позвоните:

\Drupal\Core\Cache\Cache::invalidateTags(array('state'));
Berdir
источник
Хорошо, я помогу обновить уведомление об изменении, чтобы оно было более явным, поскольку теги кэша должны использоваться в качестве замены.
Дейв Рейд
Какой надежный способ получить все ключи кеша, которые нужно пометить для удаления? Например, если я хочу очистить 'entity_bundle_extra_fields:node:article:' . $langcodeдля всех языков? Я мог бы получить список всех языков, но есть ли что-то попроще? В этом случае у него уже есть тег кеша «entity_field_info». Но, возможно, я хочу сделать недействительным менее широкий.
Donquixote
Нет, нет API кеша не имеет метода запроса / списка. И вам не следует напрямую взаимодействовать с записями в кеше кого-либо другого, используйте API, например, в данном случае менеджер полей сущностей очищает кэшированные определения. Эти записи в кеше не являются API, ядро ​​может свободно изменять ключи / структуру, и тогда ваш код будет взломан
Berdir