web-dev-qa-db-ja.com

カスタムキャッシュタグの実装

D8の新しいキャッシュタギングを使用して、さまざまなタイプ(エンティティ、ノード、ブロックなど)の関連コンテンツの同期を維持できるようにしたいと思います。しかし、この機能の現在利用可能なドキュメントを読んでも、コンテンツのアイテムを作成/更新するときに、コンテンツのアイテムに自分のキャッシュタグを追加する方法がわかりません。

たとえば、タイプStoreの新しいノードを作成するとき、キャッシュタグlocation:new_york_123をブロックに追加します。次に、ニューヨーク123の場所の表示名をソーホーに変更した場合、キャッシュタグを無効にして、関連するすべてのコンテンツを更新できます。

14
LittleCoding

これは、私が試して動作したカスタムブロックのコンテキストでキャッシュタグを使用する方法ですが、他のコンテキストにも適用できると思います

デフォルトを使用drupalタグ

ビルド配列では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'));        

drupal 8キャッシュの内部について詳細を読みたい場合

13
GiorgosK