¿Dónde agrego un nuevo contexto de caché para una entidad?

9

No he podido agregar un contexto de caché para trabajar para entidades en drupal 8. Específicamente, voy por encabezados: User-Agent. Intenté muchas variaciones de lo siguiente en un módulo.

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

 }

Estoy tratando de verificar el acceso a los nodos cuando cambia el contexto. También lo he probado en la hook_entity_build_defaults_alter()función.

ummdorian
fuente
Tenga en cuenta que el contexto de caché no influye en el acceso de nodo que tiene un usuario. El contexto de la memoria caché solo cambia cuando los datos se almacenan en la memoria caché.
kiamlaluno
El acceso de nodo como se establece en hook_node_access se almacena en caché.
ummdorian
Ese es un contenedor de caché diferente, no el que se usa para el contenido.
kiamlaluno
Vea las clases que implementan \ Drupal \ Core \ Cache \ Context \ CacheContextInterface

Respuestas:

6

De hecho deberías usar hook_entity_build_defaults_alter(). Su documentación incluso declara explícitamente esto:

Modifique los valores representables de la entidad antes de la comprobación de caché en drupal_render ().

Los valores en la #cacheclave de la matriz renderizable se usan para determinar si existe una entrada de caché para la salida renderizada de la entidad. Idealmente, solo los valores que pertenecen al almacenamiento en caché deben modificarse en este enlace.

Probablemente no funcionó para usted porque olvidó borrar el caché de renderizado después de implementar ese enlace.

Ese gancho se invoca en https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8

Consulte también https://www.drupal.org/developing/api/8/cache/contexts para obtener una descripción general de los contextos de caché (qué son, cómo usarlos, con cuáles se incluye el núcleo).

Wim Leers
fuente