Несколько раз сталкивался с тем что последний элемент 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.
506 просмотров
Взаимосвязанные материалы
Для замены стандартной иконки загрузки (Throbber) в Drupal 8 необходимо добавить следующий js код:
читать...Долго пришлось искать проблему не отображения файлов для которых созданы стили в Drupal 8. читать...
Если в последних версиях Drupal 8 появилась ошибка "Temporary file '*****.tmp' could not be created"
необходимо добавить в файл \sites\default\settings.php строку
читать...Несколько раз сталкивался с тем что последний элемент Breadcrumb кэшировался на страницах с типом "node", несмотря на то, что страница менялась. То же самое наблюдалось и с view.
читать...О том, как осуществить вывод информации с использованием ajax в Drupal 8. В Drupal 8 имеется несколько методов вывода информации через ajax - c применением методов Api и с использованием стандартных функций jQuery. При этом jQuery в Drupal 8 установлена по умолчанию. читать...