it-swarm.com.de

Verwenden von Cache-Tags für eine bestimmte Knotenliste

Das Zwischenspeichern in Drupal 8 ist großartig, aber die Dokumentation zur Verwendung von Cache-Tags für Render-Arrays in Drupal 8) ist (derzeit) dünn.

Ich habe einen Code, der im Grunde eine Liste von Knoten-Teasern generiert, beispielsweise für Inhaltstypen "Bücher" und "Magazine". Ich speichere die Liste zwischen, um die Dinge zu beschleunigen. Ich möchte die Liste jedes Mal aktualisieren, wenn ein "Buch" oder "Magazin" hinzugefügt/gelöscht/bearbeitet wird. Ich habe also ein Render-Array, das so aussieht:

$build = array(
  '#type' => 'markup',
  '#markup' => $sMarkup,        
  '#cache' => [
    'keys' => ['home-all','home'],
    'tags'=> ['node_list'], // invalidate cache when any node content is added/changed etc.
    'max-age' => '36600', // invalidate cache after 10h
  ],
);

Durch die Verwendung des Cache-Tags ['node_list'] wird der Cache beim Hinzufügen oder Bearbeiten von Inhalten ordnungsgemäß ungültig, aber auch ungültig, wenn ein hier nicht aufgeführter Inhaltstyp geändert wird, z. B. "casette".

Mit welchen Cache-Tags kann ich die Ungültigmachung einschränken, wenn nur "Buch" oder "Magazin" hinzugefügt/geändert/gelöscht wird? Ich habe versucht: ['book_list', 'magazine_list'] zu verwenden, aber das funktioniert nicht.

3
ryrye

In diesem Fall kenne ich zwei Möglichkeiten.

Eins - Schließen Sie alle Knoten-Tags (Knoten: {# id}) ein, wenn es nicht wichtig ist, ob ein neuer Knoten eines bestimmten Typs hinzugefügt wurde.

Zwei - Erstellen und steuern Sie Ihr eigenes Cache-Tag und machen Sie es ungültig, wenn Sie möchten.

Ich entwickle eine Site, die benötigt wurde, um einen Termlisten-Cache pro vocab_id zu erstellen. In diesem Fall wird mein Block jedes Mal neu erstellt, wenn ein Begriff aus einer bestimmten vocab_id das Cache-Tag mit Cache::invalidateTags($tag_id) ändert/hinzufügt/löscht.

Edit 1

Beispiel:

use Drupal\Core\Cache\Cache;

function filters_invalidate_vocabulary_cache_tag($vocab_id) {
  Cache::invalidateTags(array('filters_vocabulary:' . $vocab_id));
}

In deinem Fall ist vielleicht nur ändern $vocab_id zum $node_type.

4
Vagner

Siehe das Contrib-Modul handy_cache_tags . Ich habe es (noch) nicht benutzt, aber es gibt vor, genau das zu tun, wonach Sie suchen. Aus der Beschreibung des Moduls:

Das Modul bietet die folgenden Cache-Tags, die Sie verwenden können:

handy_cache_tags:[entity_type]
handy_cache_tags:[entity_type]:[entity_bundle]
1
Dan Chadwick