Dove posso aggiungere un nuovo contesto cache per un'entità?


9

Non sono stato in grado di aggiungere un contesto cache per lavorare con entità in drupal 8. In particolare, vado per le intestazioni: User-Agent. Ho provato molte varianti su quanto segue in un modulo.

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

 }

Sto cercando di controllare l'accesso al nodo quando questo contesto cambia. L'ho provato anche nella hook_entity_build_defaults_alter()funzione.


Si noti che il contesto della cache non influenza l'accesso al nodo di un utente. Il contesto della cache è solo per cambiare quando i dati sono memorizzati nella cache.
kiamlaluno

L'accesso al nodo impostato in hook_node_access viene memorizzato nella cache.
Ummdorian,

Questo è un altro cestino della cache, non quello usato per il contenuto.
kiamlaluno

Visualizza le classi che implementano \ Drupal \ Core \ Cache \ Context \ CacheContextInterface

Risposte:


6

Dovresti davvero usare hook_entity_build_defaults_alter(). La sua documentazione afferma anche esplicitamente questo:

Modifica i valori visualizzabili dell'entità prima del controllo della cache in drupal_render ().

I valori nella #cachechiave dell'array renderable vengono utilizzati per determinare se esiste una voce della cache per l'output di rendering dell'entità. Idealmente solo i valori relativi alla memorizzazione nella cache dovrebbero essere modificati in questo hook.

Probabilmente non ha funzionato per te perché hai dimenticato di svuotare la cache di rendering dopo aver implementato quell'hook.

Quel gancio è invocato https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8

Vedi anche https://www.drupal.org/developing/api/8/cache/contexts per una panoramica dei contesti cache (cosa sono, come usarli, con quali core viene fornito).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.