it-swarm.com.de

Wie lösche ich den Cache für einen einzelnen Knoten?

In meinem Modul kann ich cache_clear_all() (D7) oder drupal_flush_all_caches() (D8) aufrufen, wodurch der Cache für alle Knoten geleert wird.

Gibt es eine Möglichkeit, den Cache für einen einzelnen Knoten zu leeren?

Ich muss ein Modul einrichten, das beim Auswählen einer Story in einer Liste den Wert eines Knotenfelds ändert. Im Moment ändere ich den Feldwert durch Aktualisieren der Datenbanktabelle, die diesen Wert enthält, aber ich muss den Cache leeren, damit der Wert auf der gesamten Site aktualisiert wird.

Gibt es eine bessere Möglichkeit, einen Knoten zu aktualisieren, als die Datenbanktabelle direkt zu ändern?

1
Tyler

Wenn Sie das Knotenobjekt haben, verwenden Sie

use Drupal\Core\Cache\Cache;
...
Cache::invalidateTags($node->getCacheTags());

Das ist besser, als anzunehmen, dass die Cache-Tag-ID für immer 'node:' . $node->id() ist.

3
Rainer Feike

Die Drupal Cache-API kann zum Löschen bestimmter Elemente verwendet werden. Das Zwischenspeichern von Backends kann (in Memcache, in Flatfiles usw.) umgeschaltet werden, ohne dass Code neu geschrieben werden muss.

Drupal 7

Sie können versuchen, Code zu verwenden:

cache_clear_all('content:' . $node->nid, 'cache_content', TRUE);

Siehe Dokument hier

Drupal 8

Die Daten, die Drupal verwaltet), fallen in drei Kategorien:

  1. entitäten - diese haben Cache-Tags der Form <entity type ID>:<entity ID>
  2. konfiguration - Diese haben Cache-Tags der Form config:<configuration name>
  3. benutzerdefiniert (zum Beispiel library_info)

Sie können Beispiel versuchen:

using Cache :: invalidateTags

$tags = ['node:' . $node->id()];
Cache::invalidateTags($tags);

Sie können Cache-Tags sehen

3
vinhdv

Gibt es eine bessere Möglichkeit, einen Knoten zu aktualisieren, als die Datenbanktabelle direkt zu ändern?

Ja, verwenden Sie die Funktionen node_load() und node_save() , da diese alles für Sie erledigen, einschließlich des Caches.

Das Ändern der Werte direkt in der Datenbank wird nicht empfohlen, da für eine beliebige Anzahl von Modulen zusätzliche Handler hinzugefügt werden können, die nicht durch direktes Ändern der Datenbank erfasst werden.

EDIT: Für Drupal 8 verwenden Sie stattdessen $node = \Drupal\node\Entity\Node::load(), dann nur $node->save()

1
Colin Shipton

Wenn Sie über die Entität und den entsprechenden Entitätsspeicher verfügen, können Sie die Methode resetCache verwenden.

$storage = \Drupal::entityTypeManager()->getStorage($entity_type);
$storage->resetCache([$entity_id]);
0
voleger

Für Drupal 8 können Sie das Modul Clear Specific Cache verwenden

0
Ravi singh