Implémentation de balises de cache personnalisées

14

Je souhaite utiliser le nouveau balisage de cache dans D8 pour aider à synchroniser le contenu associé de différents types (entités, nœuds, blocs, etc.). Mais à la lecture de la documentation actuellement disponible de cette fonctionnalité, je ne comprends pas comment ajouter ma propre balise de cache aux éléments de contenu lors de la création / mise à jour desdits éléments.

Par exemple, lors de la création d'un nouveau nœud d'un type Store, je voudrais ajouter l'emplacement de la balise de cache: new_york_123 et la même chose pour un bloc. Ensuite, si j'ai changé le nom d'affichage de l'emplacement de New York 123 en SoHo, je pourrais invalider la balise de cache et avoir toutes les mises à jour de contenu associées.

LittleCoding
la source
1
Toutes les entités ont déjà une balise de cache (par exemple, noeud: 123) qui est automatiquement invalidée. Donc, si vous créez / mettez à jour et affichez des nœuds, vous ne devriez rien faire, cela devrait simplement fonctionner.
Berdir
lors de la création / mise à jour, il faudrait une requête pour trouver tous les types de contenu associés (nœuds, blocs, entités), puis les effacer de chaque table de cache. Si une seule balise de cache personnalisée est utilisée pour identifier la relation entre les éléments de contenu, seule cette balise doit être invalidée pour vider le cache de ces éléments associés.
LittleCoding
Je ne comprends pas ce que vous voulez dire et quelle est votre structure. Les balises sont ajoutées lors de leur utilisation. Les balises de cache doivent être ajoutées à tout élément de rendu comme un bloc s'il doit changer si ce nœud / chose est modifié. Si vous utilisez des mécanismes standard pour afficher les entités, c'est probablement déjà le cas. Si cela ne fonctionne pas, vous devez partager plus en détail, avec le code, ce que vous faites exactement.
Berdir
utilisateur de balise de cache: {ID} peut être invalidé pour déclencher la suppression du cache pour tout le contenu lié à cet utilisateur. Même idée, mais avec la balise de cache personnalisée.
LittleCoding

Réponses:

13

Voici comment utiliser les balises de cache dans le contexte des blocs personnalisés que j'ai essayés et qui fonctionnent mais je pense que cela s'applique à d'autres contextes

Utiliser des balises Drupal par défaut

Dans le tableau de construction, vous pouvez spécifier cache > tags > node_listet ce contenu de bloc serait invalidé (actualisé) lorsque TOUT NŒUD est modifié sans rien d'autre à faire de votre part

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

Vous pouvez également insérer un ou plusieurs ID de nœud / terme / utilisateur pour invalider la baie sur des nœuds ou des termes spécifiques, comme indiqué dans le commentaire de code ci-dessus. Remarque: vous pouvez mélanger et faire correspondre les nœuds, les termes, les utilisateurs et les balises personnalisées comme bon vous semble.

Utilisez vos propres balises

si vous voulez avoir votre propre façon d'effacer votre tableau de build, ajoutez votre balise unique personnalisée dans le tableau de build (n'importe quelle chaîne unique fera l'affaire)

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['MY_CUSTOM_UNIQUE_TAG'],
        ],
    );
}

et dans votre appel de logique de code personnalisé invalidateTagsavec votre propre balise

function MY_MODULE_custom_clear_cache_logic(){ 
    ...
    \Drupal\Core\Cache\Cache::invalidateTags(array('MY_CUSTOM_UNIQUE_TAG'));        

si vous voulez en savoir plus sur les internes du cache drupal 8

GiorgosK
la source
2
Je pense que l'idéal serait d'utiliser le cache_tags.invalidatorservice plutôt que de référencer directement une classe.
Andy