Здравствуйте.
Вывожу ноды типа Статья через getViewBuilder.
Мне надо, что бы кеш для всех статей, всего списка этих нод был включен навсегда ['#cache']['max-age'] = \Drupal\Core\Cache\Cache::PERMANENT;
При этом есть тег статьи node:13126. При изменении этой статьи должен инвалидироваться кеш и создаваться заново.
В случае обновления других статей кеш должен оставаться.
Список статей выводится через шаблон темизации.
//Получить объекты статей
$query = \Drupal::entityTypeManager()->getStorage('node')->getQuery();
$query->condition('type', 'my_article')
->condition('status', 1);
$ids = $query->execute();
$items = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($ids);
//Вывести все статьи через их views
if (!empty($items)) {
foreach ($items as $key => $item) {
$items[$key] = \Drupal::entityTypeManager()->getViewBuilder('node')->view($item, 'default');
$items[$key]['#cache']['max-age'] = \Drupal\Core\Cache\Cache::PERMANENT;
$items[$key]['#cache']['tag'] = ['node:13126'];
}
}
//Установить кеш для списка статей
$items['#cache']['max-age'] = \Drupal\Core\Cache\Cache::PERMANENT;
$items['#cache']['tags'] = ['node:13126'];
$build[]=[
'#theme' => 'nodes_artilces__teaser',
'#articles_list' => $items,
'#cache' => ['max-age' => \Drupal\Core\Cache\Cache::PERMANENT]
];
По итогу при изменении любой статьи кеш инвалидируется.
Подскажите, пожалуйста, в чем проблема?
Комментарии
Вы же кешируете весь список нод с ОДИНАКОВЫМ тегом. Всё закономерно. Любое изменение любой ноды из этого списка, вызовет обновление всего кеша, маркированного этим тегом.
А проблемы начинаются примерно отсюда:
<?php
...
//Вывести все статьи через их views
if (!empty($items)) {
foreach ($items as $key => $item) {
$items[$key] = \Drupal::entityTypeManager()->getViewBuilder('node')->view($item, 'default');
$items[$key]['#cache']['max-age'] = \Drupal\Core\Cache\Cache::PERMANENT;
$items[$key]['#cache']['tag'] = ['node:13126'];
// Тогда уже так:
// $items[$key]['#cache']['tag'] = ['node:' . $item->id()];
}
...
}
?>
Но и далее, при кешировании всего списка, тоже непонятно, что хотели сделать.