it-swarm.com.de

Implementieren von benutzerdefinierten Cache-Tags

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

Wenn Sie beispielsweise einen neuen Knoten vom Typ Store erstellen, möchte ich den Speicherort des Cache-Tags hinzufügen: new_york_123 und dasselbe für einen Block. Wenn ich dann den Anzeigenamen des New York 123-Speicherorts in SoHo ändere, kann ich das Cache-Tag ungültig machen und alle zugehörigen Inhalte aktualisieren.

14
LittleCoding

Hier erfahren Sie, wie Sie Cache-Tags im Kontext von benutzerdefinierten Blöcken verwenden, die ich ausprobiert habe und die funktionieren, aber ich denke, dass sie für andere Kontexte gelten

Verwenden Sie die Standard-Tags drupal)

Im Build-Array können Sie cache > tags > node_list und dieser Blockinhalt wird ungültig (aktualisiert), wenn JEDER NODE 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
        ],
    );
}

Alternativ können Sie eine oder mehrere Knoten-/Term-/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 nach Belieben mischen und abgleichen.

Verwenden Sie Ihre eigenen Tags

wenn Sie Ihre eigene Methode zum Löschen Ihres Build-Arrays haben 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 rufen Sie in Ihrer benutzerdefinierten Codelogik invalidateTags mit Ihrem eigenen Tag auf

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

wenn Sie mehr über Drupal 8 Cache Internals lesen möchten

13
GiorgosK