Onde adiciono um novo contexto de cache para uma entidade?

9

Não consegui adicionar um contexto de cache para trabalhar para entidades no drupal 8. Especificamente, estou indo para cabeçalhos: User-Agent. Eu tentei muitas variações sobre o seguinte em um 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';
   }

 }

Estou tentando obter acesso ao nó a ser verificado quando esse contexto muda. Eu também tentei na hook_entity_build_defaults_alter()função.

ummdoriano
fonte
Observe que o contexto do cache não influencia o acesso ao nó que um usuário possui. O contexto do cache é apenas para mudar quando os dados são armazenados em cache.
kiamlaluno
O acesso ao nó, conforme definido em hook_node_access, é armazenado em cache.
ummdorian
Essa é uma lixeira de cache diferente, não a usada para o conteúdo.
kiamlaluno
Veja as classes que implementam o \ Drupal \ Core \ Cache \ Context \ CacheContextInterface

Respostas:

6

Você realmente deve usar hook_entity_build_defaults_alter(). Sua documentação afirma explicitamente isso:

Altere os valores renderizáveis ​​da entidade antes da verificação do cache em drupal_render ().

Os valores na #cachechave da matriz renderizável são usados ​​para determinar se existe uma entrada de cache para a saída renderizada da entidade. Idealmente, apenas os valores que pertencem ao armazenamento em cache devem ser alterados nesse gancho.

Provavelmente não funcionou para você, porque você esqueceu de limpar o cache de renderização depois de implementar esse gancho.

Esse gancho é chamado em https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8

Consulte também https://www.drupal.org/developing/api/8/cache/contexts para obter uma visão geral dos contextos de cache (o que são, como usá-los e com os quais o núcleo é enviado).

Wim Leers
fonte