Как правильно кэшировать хлебные крошки в Drupal 8

Опубликовано admin -

Несколько раз сталкивался с тем что последний элемент Breadcrumb кэшировался на страницах с типом "node", несмотря на то, что страница менялась. То же самое наблюдалось и с view. В моей ситуации последний элемент "хлебных крошек" создавался програмно через модуль темы "name.theme"

Посмотрев информацию по этому вопросу, решение оказалось не сложным.

function developer_system_breadcrumb_alter(\Drupal\Core\Breadcrumb\Breadcrumb &$breadcrumb, \Drupal\Core\Routing\RouteMatchInterface $route_match, array $context) {

  if ($route_match && $node = $route_match->getParameter('node')) {
    $breadcrumb->addCacheContexts(['url.path']);
    $breadcrumb->addCacheableDependency($node);
    $breadcrumb->addCacheTags(['node:' . $node->id()]);

    // Handle views path expiration cache expiration.
    $parameters = $route_match->getParameters();
    foreach ($parameters as $key => $parameter) {
      if ($key === 'view_id') {
        $breadcrumb->addCacheTags(['config:views.view.' . $parameter]);
      }

    }
  }
}

Не забудьте "developer_system_breadcrumb_alter" заменить на "mymodule_system_breadcrumb_alter".

Смысл этого кода в том, что хлебные крошки будут кэшироватсья с учетом метода addCacheableDependency. Без него кэширование не происходит. При этом, как можно заметить, добавления тэгов с методом addCacheTags происходит для двух типов содержимого node и views. Как написано в API, стандартные тэги проверяются самостоятельно системой.  Для пользовательских тэгов необходимо осуществлять проверку самостоятельно.

// Пример 1 — Правильный
\Drupal::service('cache_tags.invalidator')->invalidateTags(['my_custom_tag']);

// Пример 2 — Запасной
use Drupal\Core\Cache;
Cache::invalidateTags(['my_custom_tag']);

В случае если тэг изменился, система сгенерирует новое содержимое для нового кэша.

Как я понял, метод $breadcrumb->addCacheContexts(['url.path']) отличается от метода $breadcrumb->addCacheTags(['node:' . $node->id()]) тем, что последний  предполагает проверку тэгов, а первый вариативность кэша на основании условий.

Полный список вариантов контекста кэша:

cache contexts из ядра
cookies
  :name
headers
  :name
ip
languages
  :type
request_format
route
  .book_navigation
  .menu_active_trails
    :menu_name
  .name
session
  .exists
theme
timezone
url
  .path
    .is_front // Available in 8.3.x or higher.
    .parent
  .query_args
    :key
    .pagers
      :pager_id
  .site
user
  .is_super_user
  .node_grants
    :operation
  .permissions
  .roles
    :role

Как видно из данной таблицы, для определённого элемента кэша возможно несколько типов контекста. Контекст в большинстве зависти от параметров запроса (Request).

Подробное описание использования контекста кэширование Вы можете посмотреть в статье https://www.drupal.org/docs/8/api/cache-api/cache-contexts

Еще одним методом, который возможно Вас заинтересует выступает метод mergeCacheMaxAge($max_age). Данный метод объединяет время жизни кэша с существующим, адрес с описанием метода -  mergeCacheMaxAge.

Взаимосвязанные материалы

# 1 . О том как заменить стандартную иконку (Throbber) в Drupal 8 ( ),

Для замены стандартной иконки загрузки (Throbber) в Drupal 8 необходимо добавить следующий js код:

читать...
# 2 . SetHandler none Drupal_Security...... ( ),
Долго пришлось искать проблему не отображения файлов для которых созданы стили в Drupal 8. читать...
# 3 . Temporary file '*****.tmp' could not be created ( ),

Если в последних версиях Drupal 8 появилась ошибка "Temporary file '*****.tmp' could not be created"

необходимо добавить в  файл \sites\default\settings.php  строку

читать...
# 4 . Как правильно кэшировать хлебные крошки в Drupal 8 ( ),

Несколько раз сталкивался с тем что последний элемент Breadcrumb кэшировался на страницах с типом "node", несмотря на то, что страница менялась. То же самое наблюдалось и с view. читать...

# 5 . Drupal 8. Несколько способов вывода информации черех Ajax ( ),
О том, как осуществить вывод информации с использованием ajax в Drupal 8. В Drupal 8 имеется несколько методов вывода информации через ajax - c применением методов Api и с использованием стандартных функций jQuery. При этом jQuery в Drupal 8 установлена по умолчанию. читать...
На разработку сайта! Скидки до 20%!