web-dev-qa-db-ja.com

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

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()関数でも試してみました。

9
ummdorian

実際には 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 も参照してください。 。

6
Wim Leers