Comment effacer le cache générique dans Drupal 8?

8

Dans Drupal 7, nous pouvions le faire:

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

qui supprimerait tous les emplacements de cache commençant par la chaîne state:(correspondant aux ID de cache tels que state:infoet state:nebraska).

L'enregistrement de modification sur https://www.drupal.org/node/1272696 note même ce cas d'utilisation dans l'exemple Drupal 7, mais ne fournit pas réellement un exemple de la façon de le répliquer dans D8.

Il semble que nous soyons censés utiliser des balises de cache, ce qui semble être une conversion plus coûteuse compte tenu du cas d'utilisation simple. Je ne vois aucune méthode de correspondance qui s'appliquerait dans CacheBackendInterface . Remarque, il ne s'agit pas de supprimer tous les éléments dans un bac de cache, qui est clairement couvert par deleteAll ().

Dave Reid
la source

Réponses:

8

Je ne sais pas pourquoi la réponse existante a été supprimée, elle était (presque) correcte.

L'effacement du cache des caractères génériques a été supprimé. Il était extrêmement compliqué de le prendre en charge dans les backends comme redis et memcache, qui ne prennent pas en charge les caractères génériques.

Les balises de cache sont le remplacement et ce n'est pas si compliqué à utiliser. Vous passez simplement une liste de chaînes comme 4ème argument (un peu ennuyeux de devoir définir l'argument d'horodatage par défaut, une méthode distincte serait bien):

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

puis appelez:

\Drupal\Core\Cache\Cache::invalidateTags(array('state'));
Berdir
la source
Ok, je vais aider à mettre à jour l'avis de modification pour être plus explicite sur le fait que les balises de cache doivent être utilisées en remplacement.
Dave Reid
Quel est un moyen fiable d'obtenir toutes les clés de cache qui doivent être marquées pour suppression? Par exemple, si je veux effacer 'entity_bundle_extra_fields:node:article:' . $langcodepour toutes les langues? Je pourrais obtenir une liste de toutes les langues, mais y a-t-il quelque chose de plus simple? Dans ce cas, il a déjà une balise de cache, 'entity_field_info'. Mais peut-être que je veux invalider moins large.
donquixote
Non, il n'y en a pas. L'API de cache n'a pas de méthode de requête / liste. Et vous ne devez pas interagir directement avec les entrées de cache de quelqu'un d'autre, utilisez l'API, par exemple, le gestionnaire de champs d'entité efface les définitions mises en cache dans ce cas. Ces entrées de cache ne sont pas une API, le noyau est libre de changer les clés / structure et votre code serait alors cassé
Berdir