Drupal 8でキャッシュをクリアするワイルドカードの方法は?


8

Drupal 7では、これを行うことができました。

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

これは、文字列で始まるキャッシュビン全体を削除しますstate:state:infoおよびなどの一致するキャッシュID state:nebraska)。

https://www.drupal.org/node/1272696の変更レコードは、Drupal 7の例でこの使用例を示していますが、実際にD8でそれを複製する方法の例を提供していません。

キャッシュタグを使用することになっているようですが、これは単純なユースケースを考えると、より高価な変換のようです。CacheBackendInterfaceに適用される一致するメソッドはありません。これは、キャッシュビン内のすべてのアイテムを削除することではなく、deleteAll()で明確にカバーされていることに注意してください。

回答:


8

既存の回答が削除された理由がわからない、それは(ほぼ)正しかった。

ワイルドカードキャッシュのクリアが削除されました。ワイルドカードをサポートしていないredisやmemcacheなどのバックエンドでのサポートは非​​常に複雑でした。

キャッシュタグは置換であり、使用するのはそれほど複雑ではありません。文字列のリストを4番目の引数として渡すだけです(デフォルトのタイムスタンプ引数を設定する必要があるので少し面倒ですが、別の方法がいいでしょう)。

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

次に呼び出す:

\Drupal\Core\Cache\Cache::invalidateTags(array('state'));

わかりました。キャッシュタグを代わりに使用する必要があることをより明確にするために、変更通知を更新します。
Dave Reid

削除のためにタグ付けする必要があるすべてのキャッシュキーを取得する信頼できる方法は何ですか?たとえば'entity_bundle_extra_fields:node:article:' . $langcode、すべての言語でクリアしたい場合はどうなりますか?すべての言語のリストを取得できますが、もっと簡単なものはありますか?この場合、キャッシュタグ 'entity_field_info'がすでにあります。しかし、あまり広くないものを無効にしたいのかもしれません。
donquixote 2017

いいえ、ありません。キャッシュAPIにはクエリ/リストメソッドはありません。また、他の誰かのキャッシュエントリと直接やり取りしてはならず、APIを使用してください。たとえば、この場合、エンティティフィールドマネージャーはキャッシュされた定義をクリアします。これらのキャッシュエントリはAPIではなく、コアはキー/構造を自由に変更できるため、コードが壊れます
Berdir
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.