Эффективное кеширование по доступу к ноде: параметрический Cache Context в Drupal

Когда мы используем кеширование в Drupal, типичный подход — добавить user в список контекстов: ['user']. Это означает, что для каждого пользователя будет создана своя версия кеша. Иногда это оправдано. Но если доступ можно классифицировать в ограниченное число состояний — гораздо разумнее кешировать по этим состояниям.

В этой статье я покажу, как реализовать параметрический кеш-контекст на основе интерфейса CalculatedCacheContextInterface. Мы создадим собственный cache context, который учитывает тип доступа пользователя к конкретной ноде и используем его в hook_entity_view().

Пример: Кеширование тизера по виду доступа

Допустим, у нас есть статьи, доступ к которым может быть:

  • открыт для всех,
  • ограничен подпиской,
  • доступен только после покупки.

Данные о наличии подписке и купленные статьи находятся в сущности user.
Если кешировать по user, база быстро раздуется. А если кешировать по состоянию доступа — мы сократим количество вариантов в десятки (или сотни) раз.

Реализация CalculatedCacheContextInterface

Drupal предоставляет пару способов создания собственных кеш-контекстов:

  • CacheContextInterface — используется для обычных, глобальных контекстов (например, user, language).
  • CalculatedCacheContextInterface — расширяет первый и добавляет возможность передавать параметр в контекст, делая его параметрическим.

Нам подходит именно CalculatedCacheContextInterface, потому что:

  • Мы хотим кешировать не по пользователю, а по состоянию доступа к ноде.
  • Это состояние зависит одновременно от пользователя и от конкретной ноды.
  • Нам нужно передать ID ноды как параметр в контекст, что невозможно с обычным CacheContextInterface.

Создаём класс AccessToNodeCacheContext:

Регистрируем эту реализацию как сервис:

Использование кеш-контекста

Подключим параметрический контекст в hook_node_view():

Здесь мы передаём ID ноды как параметр в кеш-контекст access_to_node. Drupal при генерации кеша вызовет getContext() и передаст туда этот параметр.

Как работает AccessState

Я не привожу полной реализации AccessState — это часть бизнес-логики, реализованная в виде сервиса с одним методом: getAccessState($node) — возвращает тип доступа пользователя к указанной статье.


Параметрический cache context — мощный инструмент для контроля объёма кеша. Вместо тысяч кеш-ключей по user, мы получаем 2–5 вариантов на каждую ноду — а это существенная оптимизация.

Если вы сталкиваетесь с подобной задачей — не спешите использовать ['user'] в контексте, подумайте, можно ли выразить различие через вычисляемый параметр.

Мало букафф? Читайте есчо !

Добавляем в page cache зависимость от значения cookie

Март 4, 2025 г.

Модуль page_cache использует http_middleware, чтобы зацепиться за объект request и произвести кеширование страницы. Работает он для анонимных пользователей. ...

Читать

Кастомные настройки сайта в Drupal

Март 9, 2025 г.

На сайте всегда (или почти всегда) возникает задача управления настройками вроде телефон, email, какие то текстовые элементы, вроде копирайта, адрес организации и т.п. С точки зрения данных - требуется объект в терминах шаблонов проектирования - синглтон. ...

Читать
 

Комментарии к «Эффективное кеширование по доступу к ноде: параметрический Cache Context в Drupal»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: