web-dev-qa-db-fra.com

Implémentation de balises de cache personnalisées

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.

14
LittleCoding

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 les balises drupal par défaut

Dans le tableau de génération, vous pouvez spécifier cache > tags > node_list et le contenu de ce 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
        ],
    );
}

Alternativement vous pouvez insérer un ou plusieurs ID de nœud/terme/utilisateur pour invalider le tableau 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 logique de code personnalisé, appelez invalidateTags avec 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 drupal 8 cache internals

13
GiorgosK