Como limpar o cache curinga no Drupal 8?

8

No Drupal 7, costumávamos fazer isso:

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

que excluiria qualquer entrada na bandeja de cache iniciada com a cadeia state:(IDs de cache correspondentes como state:infoe state:nebraska).

O registro de alterações em https://www.drupal.org/node/1272696 até observa esse caso de uso no exemplo do Drupal 7, mas na verdade não fornece um exemplo de como replicá-lo no D8.

Parece que devemos usar tags de cache, o que parece ser uma conversão mais cara, considerando o caso de uso simples. Não vejo nenhum método correspondente que se aplique no CacheBackendInterface . Observe que não se trata de excluir todos os itens em uma bandeja de cache, que é claramente coberta por deleteAll ().

Dave Reid
fonte

Respostas:

8

Não sei por que a resposta existente foi excluída, estava (quase) correta.

As limpezas do cache curinga foram removidas. Era extremamente complicado oferecer suporte em back-end como redis e memcache, que não têm suporte a caracteres curinga.

Tags de cache é a substituição e não é tão complicado de usar. Você acabou de passar uma lista de strings como o 4º argumento (um pouco irritante que você precise definir o argumento de carimbo de data e hora padrão, um método separado seria bom):

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

e depois chame:

\Drupal\Core\Cache\Cache::invalidateTags(array('state'));
Berdir
fonte
Ok, eu ajudarei a atualizar o aviso de alteração para ser mais explícito que as tags de cache devem ser usadas como substituição.
Dave Reid
Qual é uma maneira confiável de obter todas as chaves de cache que precisam ser marcadas para exclusão? Por exemplo, se eu quiser limpar 'entity_bundle_extra_fields:node:article:' . $langcodepara todos os idiomas? Eu poderia obter uma lista de todos os idiomas, mas há algo mais simples? Nesse caso, ele já possui uma tag de cache, 'entity_field_info'. Mas talvez eu queira invalidar menos amplo.
Donquixote
Não, não há. A API de cache não possui método de consulta / lista. E você não deve interagir diretamente com as entradas de cache de outra pessoa, use a API, por exemplo, o gerente de campo de entidade limpa as definições em cache nesse caso. Essas entradas de cache não são uma API, o núcleo é livre para mudar as teclas / estrutura e, em seguida, seu código seria quebrado
Berdir