Где я могу добавить новый контекст кеша для сущности?

9

Я не смог получить добавление контекста кеша для работы с сущностями в drupal 8. В частности, я собираюсь использовать заголовки: User-Agent. Я попробовал много вариантов следующего в модуле.

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

 }

Я пытаюсь проверить доступ к узлу при изменении этого контекста. Я также попробовал это в hook_entity_build_defaults_alter()функции.

ummdorian
источник
Обратите внимание, что контекст кэша не влияет на доступ к узлу, который есть у пользователя. Контекст кэширования просто изменяется при кэшировании данных.
kiamlaluno
Доступ к узлу, установленный в hook_node_access, кэшируется.
Ummdorian
Это другой кэш, а не тот, который используется для контента.
kiamlaluno
Посмотрите классы, которые реализуют \ Drupal \ Core \ Cache \ Context \ CacheContextInterface

Ответы:

6

Вы действительно должны использовать hook_entity_build_defaults_alter(). Его документация даже прямо заявляет это:

Измените визуализируемые значения сущностей перед проверкой кэша в drupal_render ().

Значения в #cacheключе отображаемого массива используются, чтобы определить, существует ли запись кэша для визуализированного вывода объекта. В идеале в этом хуке должны быть изменены только те значения, которые относятся к кешированию.

Возможно, это не сработало, потому что вы забыли очистить кэш рендеринга после реализации этого хука.

Этот хук вызывается в https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8

Также см. Https://www.drupal.org/developing/api/8/cache/contexts для обзора контекста кэша (что это такое, как их использовать, с какими ядрами поставляется ядро).

Вим Лирс
источник