Установите максимальный/отключите пользовательский кэш блоков для анонимных пользователей
У меня есть небольшая проблема, касающаяся моего пользовательского блочного модуля. Сам модуль извлекает данные о погоде с помощью json-запроса, и данные отображаются пользователю в виде прогноза погоды на 4 дня. Поскольку погода должна обновляться каждый день, я хочу установить "максимальное время кэширования" или даже отключить кэширование для всего блока. Прямо сейчас мне пришлось бы каждый день вручную сливать наличные.
После небольшого исследования этой темы я обнаружил, что использование 'max-age'
в сборке() функция сделала бы свое дело, но она никак не влияет на кэширование для анонимных пользователей.
Использование \Drupal::service('page_cache_kill_switch')->trigger();
отключит кэш для определенной страницы или типа контента, но я не хочу отключать кэширование для всей страницы сразу.
Итак, как я могу запустить кэширование для моего пользовательского блока? Или есть ли вообще способ отключить кэширование для определенной части кода, например, json-запроса в моем случае?
1 answers
Это известная проблема Отображение максимального возраста элементов в заголовках страницы и кэше страницы.
Внутренний кэш страниц предназначен для содержимого базы данных, которое обрабатывается тегами кэша. Таким образом, обходным путем было бы добавить пользовательский тег кэша в блок
$build['#cache']['tags'][] = 'weather_forecast';
, который всплывет до уровня страницы, и таким образом вы сможете аннулировать оба кэшированных элемента, блок и страницу, в задании cron:
/**
* Implements hook_cron().
*/
function mymodule_cron() {
\Drupal\Core\Cache\Cache::invalidateTags(['weather_forecast']);
}
Все заслуги принадлежат @Berdir: Максимальный возраст кэша и лак ESI (ЕСИ)