Où ajouter un nouveau contexte de cache pour une entité?

9

Je n'ai pas pu obtenir l'ajout d'un contexte de cache pour travailler pour les entités dans Drupal 8. Plus précisément, je vais pour les en-têtes: User-Agent. J'ai essayé de nombreuses variantes sur les éléments suivants dans un module.

 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';
   }

 }

J'essaie d'obtenir l'accès au nœud à vérifier lorsque ce contexte change. Je l'ai également essayé dans la hook_entity_build_defaults_alter()fonction.

ummdorian
la source
Notez que le contexte du cache n'influence pas l'accès au nœud d'un utilisateur. Le contexte du cache doit simplement changer lorsque les données sont mises en cache.
kiamlaluno
L'accès au nœud tel que défini dans hook_node_access est mis en cache.
ummdorian
Il s'agit d'un bac de cache différent, pas celui utilisé pour le contenu.
kiamlaluno
Voir les classes qui implémentent \ Drupal \ Core \ Cache \ Context \ CacheContextInterface

Réponses:

6

Vous devez en effet utiliser hook_entity_build_defaults_alter(). Sa documentation l'indique même explicitement:

Modifiez les valeurs de rendu d'entité avant la vérification du cache dans drupal_render ().

Les valeurs de la #cacheclé du tableau pouvant être rendu sont utilisées pour déterminer s'il existe une entrée de cache pour la sortie rendue de l'entité. Idéalement, seules les valeurs relatives à la mise en cache doivent être modifiées dans ce hook.

Cela n'a probablement pas fonctionné pour vous car vous avez oublié de vider le cache de rendu après avoir implémenté ce hook.

Ce crochet est invoqué dans https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8

Voir également https://www.drupal.org/developing/api/8/cache/contexts pour un aperçu des contextes de cache (ce qu'ils sont, comment les utiliser, lesquels sont fournis avec le noyau).

Wim Leers
la source