エンティティの新しいキャッシュコンテキストはどこに追加しますか?


9

drupal 8のエンティティで機能するキャッシュコンテキストを追加できませんでした。具体的には、headers:User-Agentを使用します。モジュールで次のような多くのバリエーションを試しました。

 use Drupal\node\NodeInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

 function hook_entity_view_alter(&$build, EntityInterface $entity, EntityViewDisplayInterface $display){
   if($entity->getType() == 'relevant_type'){
    $build['#cache']['contexts'][] = 'headers:User-Agent';
   }

 }

そのコンテキストが変更されたときにノードアクセスをチェックするようにしています。hook_entity_build_defaults_alter()関数でも試してみました。


キャッシュコンテキストは、ユーザーが持つノードアクセスに影響しないことに注意してください。キャッシュコンテキストは、データがキャッシュされるときに変更されるだけです。
kiamlaluno

hook_node_accessで設定されたノードアクセスがキャッシュされます。
ウンムリア語2016

これは、コンテンツに使用されるものではなく、別のキャッシュビンです。
kiamlaluno

\ Drupal \ Core \ Cache \ Context \ CacheContextInterfaceを実装するクラスを参照してください

回答:


6

実際に使用する必要がありますhook_entity_build_defaults_alter()。そのドキュメントはこれを明示的に述べています:

drupal_render()でキャッシュをチェックする前に、エンティティのレンダリング可能な値を変更します。

#cacheレンダリング可能な配列のキーの値は、エンティティのレンダリングされた出力にキャッシュエントリが存在するかどうかを判断するために使用されます。理想的には、このフックではキャッシングに関係する値のみを変更する必要があります。

そのフックの実装後にレンダーキャッシュをクリアするのを忘れたため、おそらく機能しませんでした。

そのフックはhttps://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8で呼び出されます

キャッシュコンテキストの概要については、https://www.drupal.org/developing/api/8/cache/contextsも参照してください(キャッシュコンテキストの概要、使用方法、コアに付属しているもの)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.