Установите максимальный/отключите пользовательский кэш блоков для анонимных пользователей


У меня есть небольшая проблема, касающаяся моего пользовательского блочного модуля. Сам модуль извлекает данные о погоде с помощью json-запроса, и данные отображаются пользователю в виде прогноза погоды на 4 дня. Поскольку погода должна обновляться каждый день, я хочу установить "максимальное время кэширования" или даже отключить кэширование для всего блока. Прямо сейчас мне пришлось бы каждый день вручную сливать наличные.

После небольшого исследования этой темы я обнаружил, что использование 'max-age' в сборке() функция сделала бы свое дело, но она никак не влияет на кэширование для анонимных пользователей.

Использование \Drupal::service('page_cache_kill_switch')->trigger(); отключит кэш для определенной страницы или типа контента, но я не хочу отключать кэширование для всей страницы сразу.

Итак, как я могу запустить кэширование для моего пользовательского блока? Или есть ли вообще способ отключить кэширование для определенной части кода, например, json-запроса в моем случае?

Author: tinytree, 2017-09-02

1 answers

Это известная проблема Отображение максимального возраста элементов в заголовках страницы и кэше страницы.

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

$build['#cache']['tags'][] = 'weather_forecast';

, который всплывет до уровня страницы, и таким образом вы сможете аннулировать оба кэшированных элемента, блок и страницу, в задании cron:

/**
 * Implements hook_cron().
 */
function mymodule_cron() {
  \Drupal\Core\Cache\Cache::invalidateTags(['weather_forecast']);
}

Все заслуги принадлежат @Berdir: Максимальный возраст кэша и лак ESI (ЕСИ)

 2
Author: 4k4, 2017-09-02 15:25:09