Wie lösche ich den Platzhalter-Cache in Drupal 8?

8

In Drupal 7 konnten wir dies früher tun:

cache_clear_all('state:', 'cache', TRUE)

Dadurch werden alle Cache-Bin-Einträge gelöscht, die mit der Zeichenfolge begonnen haben state:(übereinstimmende Cache-IDs wie state:infound state:nebraska).

Der Änderungsdatensatz unter https://www.drupal.org/node/1272696 vermerkt diesen Anwendungsfall sogar im Drupal 7-Beispiel, enthält jedoch kein Beispiel für die Replikation in D8.

Es scheint, dass wir Cache-Tags verwenden sollen, was angesichts des einfachen Anwendungsfalls eine teurere Konvertierung darstellt. Ich sehe keine passenden Methoden, die in CacheBackendInterface gelten würden . Beachten Sie, dass hier nicht alle Elemente in einem Cache-Bin gelöscht werden, der eindeutig von deleteAll () abgedeckt wird.

Dave Reid
quelle

Antworten:

8

Ich bin mir nicht sicher, warum die vorhandene Antwort gelöscht wurde, sie war (fast) korrekt.

Das Löschen des Platzhalter-Cache wurde entfernt. Die Unterstützung in Backends wie Redis und Memcache, die keine Wildcard-Unterstützung bieten, war äußerst kompliziert.

Cache-Tags sind der Ersatz und die Verwendung ist nicht so kompliziert. Sie geben einfach eine Liste von Zeichenfolgen als 4. Argument weiter (etwas ärgerlich, dass Sie das Standard-Zeitstempel-Argument festlegen müssen, eine separate Methode wäre hilfreich):

\Drupal::cache('default')->set('state:info', $your_data, Cache::PERMANENT, 
['state']);

und dann anrufen:

\Drupal\Core\Cache\Cache::invalidateTags(array('state'));
Berdir
quelle
Ok, ich werde helfen, den Änderungshinweis zu aktualisieren, um deutlicher zu machen, dass Cache-Tags als Ersatz verwendet werden müssen.
Dave Reid
Was ist ein zuverlässiger Weg, um alle Cache-Schlüssel zu erhalten, die zum Löschen markiert werden müssen? ZB wenn ich 'entity_bundle_extra_fields:node:article:' . $langcodefür alle Sprachen löschen möchte ? Ich könnte eine Liste aller Sprachen bekommen, aber gibt es etwas Einfacheres? In diesem Fall hat es bereits das Cache-Tag 'entity_field_info'. Aber vielleicht möchte ich weniger breit ungültig machen.
Donquijote
Nein, da ist kein. Die Cache-API verfügt über keine Abfrage- / Listenmethode. Und Sie sollten nicht direkt mit Cache-Einträgen einer anderen Person interagieren, sondern die API verwenden, z. B. in diesem Fall zwischengespeicherte Definitionen des Entity Field Managers löschen. Diese Cache-Einträge sind keine API, der Kern kann die Schlüssel / Struktur frei ändern und dann wäre Ihr Code kaputt
Berdir