現在のページのnidを取得し、値をブロックテンプレートに渡すカスタムブロックMyCustomBlock.phpを含むモジュールがあります。
$node = \Drupal::routeMatch()->getParameter('node');
$nid = $node->nid->value;
return array(
'currentnid' => $nid,
);
テンプレート内で、渡された値{{currentnid}}を出力しますが、これはキャッシュのクリーニングのみで機能します!たとえば、nid 5のページをロードすると5が印刷されますが、nid 3のページに移動すると5が印刷されます。キャッシュを消去し、nid 3でページをリロードすると、値3が印刷されます。 D8のテンプレートキャッシングシステムの問題だと思いますが、これについて何か考えはありますか?
ブロックはキャッシュされます。ただし、ブロックはDrupal 8でもコンテキストに対応しています。キャッシュコンテキストに関するドキュメントページでは、次のようになっています。
キャッシュコンテキストは、キャッシュする必要がある何かのコンテキスト依存のバリエーションを作成する宣言的な方法を提供します。宣言型にすることで、キャッシュを作成するコードが読みやすくなり、同じコンテキストのバリエーションが必要なすべての場所で同じロジックを繰り返す必要がなくなります。
Cache API のドキュメントページは、どなたにもお読みいただけます。
BlockプラグインはgetCacheContextsを実装する必要があります。この場合、 "route.name"または "url.path"のいずれかである必要があると思います。特定のユースケースでは、これについてもう少し掘り下げる必要があるかもしれません。
public function getCacheContexts() {
return array('route.name');
}
これを行う適切な方法は、コンテキストを使用することです。キャッシュコンテキストではなく、プラグインコンテキスト。
NodeType 条件プラグインと同様に、プラグインアノテーションに次のように記述します。
* context_definitions = {
* "node" = @ContextDefinition("entity:node", label = @Translation("Node"))
* }
次に、$ this-> getContextValue( 'node')を使用してノードを取得します。
これには2つの利点があります。