Кеш не работает

Главные вкладки

Аватар пользователя mmjmm mmjmm 15 июля 2022 в 9:02

Здравствуйте.
Вывожу ноды типа Статья через 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]
];

По итогу при изменении любой статьи кеш инвалидируется.
Подскажите, пожалуйста, в чем проблема?

Лучший ответ

Аватар пользователя OldWarrior OldWarrior 16 июля 2022 в 2:19
1

Вы же кешируете весь список нод с ОДИНАКОВЫМ тегом. Всё закономерно. Любое изменение любой ноды из этого списка, вызовет обновление всего кеша, маркированного этим тегом.

А проблемы начинаются примерно отсюда:

<?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()];
  
}
...
}
?>

Но и далее, при кешировании всего списка, тоже непонятно, что хотели сделать.

Комментарии

Аватар пользователя OldWarrior OldWarrior 16 июля 2022 в 2:19
1

Вы же кешируете весь список нод с ОДИНАКОВЫМ тегом. Всё закономерно. Любое изменение любой ноды из этого списка, вызовет обновление всего кеша, маркированного этим тегом.

А проблемы начинаются примерно отсюда:

<?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()];
  
}
...
}
?>

Но и далее, при кешировании всего списка, тоже непонятно, что хотели сделать.