D8の新しいキャッシュタギングを使用して、さまざまなタイプ(エンティティ、ノード、ブロックなど)の関連コンテンツの同期を維持できるようにしたいと思います。しかし、この機能の現在利用可能なドキュメントを読んでも、コンテンツのアイテムを作成/更新するときに、コンテンツのアイテムに自分のキャッシュタグを追加する方法がわかりません。
たとえば、タイプStoreの新しいノードを作成するとき、キャッシュタグlocation:new_york_123をブロックに追加します。次に、ニューヨーク123の場所の表示名をソーホーに変更した場合、キャッシュタグを無効にして、関連するすべてのコンテンツを更新できます。
これは、私が試して動作したカスタムブロックのコンテキストでキャッシュタグを使用する方法ですが、他のコンテキストにも適用できると思います
ビルド配列ではcache > tags > node_list
を指定できます。このブロックのコンテンツは、ANY NODEが変更され、他に何もしないと無効になります(更新されます)。
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
],
);
}
または上記のコードコメントに示すように、1つ以上のノード/用語/ユーザーIDを入力して、特定のノードまたは用語の配列を無効にすることができます。注:必要に応じて、ノード、用語、ユーザー、カスタムタグを混在させて一致させることができます。
ビルド配列をクリアする独自の方法が必要な場合は、ビルド配列にカスタムの一意のタグを追加します(一意の文字列で実行できます)
public function build() {
return array(
'#markup' => MY_MODULE_awesome_dynamic_node_content(),
'#cache' => [
'tags' => ['MY_CUSTOM_UNIQUE_TAG'],
],
);
}
カスタムコードロジックで、独自のタグを付けてinvalidateTags
を呼び出します
function MY_MODULE_custom_clear_cache_logic(){
...
\Drupal\Core\Cache\Cache::invalidateTags(array('MY_CUSTOM_UNIQUE_TAG'));