Wo füge ich einen neuen Cache-Kontext für eine Entität hinzu?

9

Ich konnte keinen Cache-Kontext hinzufügen, um für Entitäten in Drupal 8 zu arbeiten. Insbesondere gehe ich für Header: User-Agent. Ich habe viele Variationen der folgenden in einem Modul ausprobiert.

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

 }

Ich versuche, den Knotenzugriff zu überprüfen, wenn sich dieser Kontext ändert. Ich habe es auch in der hook_entity_build_defaults_alter()Funktion versucht .

ummdorian
quelle
Beachten Sie, dass der Cache-Kontext den Knotenzugriff eines Benutzers nicht beeinflusst. Der Cache-Kontext soll sich nur ändern, wenn Daten zwischengespeichert werden.
Kiamlaluno
Der in hook_node_access festgelegte Knotenzugriff wird zwischengespeichert.
Ummdorian
Dies ist ein anderer Cache-Bereich, der nicht für den Inhalt verwendet wird.
Kiamlaluno
Siehe Klassen, die \ Drupal \ Core \ Cache \ Context \ CacheContextInterface

Antworten:

6

Sie sollten in der Tat verwenden hook_entity_build_defaults_alter(). In der Dokumentation heißt es sogar ausdrücklich:

Ändern Sie die renderbaren Werte der Entität, bevor Sie den Cache in drupal_render () prüfen.

Die Werte im #cacheSchlüssel des renderbaren Arrays werden verwendet, um zu bestimmen, ob ein Cache-Eintrag für die gerenderte Ausgabe der Entität vorhanden ist. Im Idealfall sollten in diesem Hook nur Werte geändert werden, die sich auf das Caching beziehen.

Bei Ihnen hat es wahrscheinlich nicht funktioniert, weil Sie vergessen haben, den Render-Cache nach der Implementierung dieses Hooks zu löschen.

Dieser Hook wird in https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8 aufgerufen

Unter https://www.drupal.org/developing/api/8/cache/contexts finden Sie auch eine Übersicht über die Cache-Kontexte (was sie sind, wie sie verwendet werden, mit welchen Kernkontexten sie geliefert werden).

Wim Leers
quelle