Implementieren benutzerdefinierter Cache-Tags

13

Ich möchte das neue Cache-Tagging in D8 verwenden, um verwandte Inhalte verschiedener Typen (Entitäten, Knoten, Blöcke usw.) synchron zu halten. Nach dem Lesen der derzeit verfügbaren Dokumentation zu dieser Funktion verstehe ich jedoch nicht, wie ich beim Erstellen / Aktualisieren dieser Elemente meinen eigenen Cache-Tag zu den Inhaltselementen hinzufügen kann.

Zum Beispiel möchte ich beim Erstellen eines neuen Knotens vom Typ Store den Cache-Tag-Speicherort hinzufügen: new_york_123 und dasselbe für einen Block. Wenn ich dann den Anzeigenamen des New York 123-Standorts in SoHo änderte, konnte ich das Cache-Tag ungültig machen und alle zugehörigen Inhalte aktualisieren.

LittleCoding
quelle
1
Alle Entitäten haben bereits ein Cache-Tag (z. B. Node: 123), das automatisch ungültig wird. Wenn Sie also nur Knoten erstellen / aktualisieren und anzeigen, sollten Sie nichts tun müssen, es sollte nur funktionieren.
Berdir
Beim Erstellen / Aktualisieren ist eine Abfrage erforderlich, um alle zugehörigen Inhaltstypen (Knoten, Blöcke, Entitäten) zu finden und diese dann aus jeder Cache-Tabelle zu löschen. Wenn ein einzelnes benutzerdefiniertes Cache-Tag zum Identifizieren der Beziehung der Inhaltselemente verwendet wird, muss nur dieses Tag ungültig gemacht werden, um den Cache dieser verwandten Elemente zu leeren.
LittleCoding
Ich verstehe nicht, was du meinst und wie deine Struktur ist. Tags werden hinzugefügt, wenn sie verwendet werden. Cache-Tags sollten zu jedem Render-Element wie einem Block hinzugefügt werden, wenn es sich ändern muss, wenn der Knoten / das Objekt geändert wird. Wenn Sie Standardmechanismen zum Anzeigen von Entitäten verwenden, ist dies wahrscheinlich bereits der Fall. Wenn es nicht funktioniert, müssen Sie mit Code detaillierter mitteilen, was genau Sie tun.
Berdir
Cache-Tag-Benutzer: {ID} könnte ungültig gemacht werden, um das Löschen des Caches für alle mit diesem Benutzer verknüpften Inhalte auszulösen. Gleiche Idee, aber mit dem benutzerdefinierten Cache-Tag.
LittleCoding

Antworten:

12

Hier erfahren Sie, wie Sie Cache-Tags im Kontext von benutzerdefinierten Blöcken verwenden, die ich ausprobiert habe und die meiner Meinung nach auch in anderen Kontexten funktionieren

Verwenden Sie Standard-Drupal-Tags

In dem Build-Array können Sie angeben, dass cache > tags > node_listdieser Blockinhalt ungültig (aktualisiert) wird, wenn ein beliebiger Knoten geändert wird, ohne dass Sie etwas anderes tun müssen

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

Alternative Sie eine oder mehrere Knoten- / Begriffs- / Benutzer-IDs eingeben, um das Array auf bestimmten Knoten oder Begriffen ungültig zu machen, wie im obigen Codekommentar gezeigt. Hinweis: Sie können Knoten, Begriffe, Benutzer und benutzerdefinierte Tags beliebig mischen und zuordnen.

Verwenden Sie Ihre eigenen Tags

Wenn Sie Ihr Build-Array auf Ihre eigene Weise löschen möchten, fügen Sie Ihr benutzerdefiniertes eindeutiges Tag in das Build-Array ein (jede eindeutige Zeichenfolge reicht aus).

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

und in Ihrer benutzerdefinierten Code-Logik invalidateTagsmit Ihrem eigenen Tag aufrufen

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

Wenn Sie mehr über Drupal 8-Cache-Interna erfahren möchten

GiorgosK
quelle
2
Ich denke, Sie würden den cache_tags.invalidatorService idealerweise eher nutzen, als eine Klasse direkt zu referenzieren.
Andy