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


13

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

たとえば、ストアタイプの新しいノードを作成するときに、キャッシュタグlocation:new_york_123とaaブロックに同じものを追加します。次に、New York 123の場所の表示名をSoHoに変更した場合、キャッシュタグを無効にして、関連するすべてのコンテンツを更新できます。


1
すべてのエンティティには、自動的に無効化されるキャッシュタグ(ノード:123など)が既にあります。したがって、ノードを作成/更新および表示するだけであれば、何もする必要はなく、正常に機能するはずです。
ベルディール

作成/更新時に、関連するすべてのコンテンツタイプ(ノード、ブロック、エンティティ)を検索し、各キャッシュテーブルからそれらをクリアするクエリが必要になります。単一のカスタムキャッシュタグを使用してコンテンツアイテムの関係を特定する場合、それらの関連アイテムのキャッシュをクリアするには、そのタグのみを無効にする必要があります。
-LittleCoding

私はあなたが何を意味し、あなたの構造が何であるか理解していません。タグは使用時に追加されます。そのノード/ものが変更された場合に変更する必要がある場合は、キャッシュタグをブロックなどのレンダリング要素に追加する必要があります。エンティティを表示するために標準のメカニズムを使用している場合、それはすでに事実です。機能しない場合は、コードを使用して、正確に何をしているかをより詳細に共有する必要があります。
ベルディール

キャッシュタグuser:{ID}を無効にして、そのユーザーに関連するすべてのコンテンツのキャッシュクリアをトリガーできます。同じ考えですが、カスタムキャッシュタグを使用します。
-LittleCoding

回答:


12

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

デフォルトのdrupalタグを使用する

ビルド配列で指定することができ、任意のcache > tags > node_listノードが他に何もすることなく変更されると、このブロックのコンテンツは無効になります(更新されます)

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のキャッシュ内部についてもっと読みたいなら


2
理想的にはcache_tags.invalidator、クラスを直接参照するのではなく、サービスを使用すると思います。
アンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.