Как отключить кэш веток и блоков для определенного модуля?
Я работаю над модулем в Drupal 8, который извлекает данные, зависящие от времени, из внешнего REST api. Данные обрабатываются и передаются в Блок. Окончательные данные отправляются в шаблон ветки следующим образом:
...
public function build() {
$build = [];
$build['ticker_block'] = [
'#theme' => 'module_theme',
'#data' => $myService->data(),
];
return $build;
}
Это не работает в производственной среде, где включен кэш, и отображаемые данные отображаются как устаревшие. Как отключить кэш только для моего модуля и нужно ли это делать как для шаблона Twig, так и для плагина блока?
5 answers
Вы можете управлять кэшем в массиве визуализации с помощью элемента #cache.
Чтобы отключить кэш, добавьте:
$build['#cache']['max-age'] = 0;
В этом случае блок не будет кэшироваться для зарегистрированных пользователей или анонимных пользователей с сеансом.
Если вы хотите отключить кэш для анонимных пользователей без сеанса:
Отключите его либо полностью удалив модуль page_cache, либо включив переключатель отключения, см. Как я могу предотвратить появление определенной страницы кэшированный? например.
Кэширование кода ветки не связано с этим, код ветки кэшируется только один раз, в первый раз, когда он используется после очистки кэша.
(редактировать в соответствии с комментариями Бердира)
Чтобы остановить кэширование определенного блока, используйте следующую функцию:
/**
* Implements hook_preprocess_HOOK() for block.html.twig.
*/
function template-name_preprocess_block(&$vars) {
if($vars['derivative_plugin_id'] == 'add-block-id-name') {
//-- This stops the block being cache in drupal 8
$vars['#cache']['max-age'] = 0;
}
}
Отключить кэш для определенной страницы/типа контента/контроллера
Отключите кэш для пользовательской страницы из объявления маршрута.
Если вы хотите отключить кэш для пользовательского контроллера (пользовательского модуля), у вас есть
мой модуль.маршрутизация.ymlno_cache
опция (ВАШ_МОДУЛЬ.маршрутизация.yml). Пример: Файл : mymodule.routing.yml
mymodule.myroute:
path: '/mymodule/mypage'
defaults:
_controller: '\Drupal\mymodule\Controller\Pages::mypage'
_title: 'No cache page'
requirements:
_access: 'TRUE'
options:
no_cache: 'TRUE'
Добавлена опция маршрута "no_cache", чтобы пометить ответы маршрута как недоступные для кэширования
Чтобы предотвратить кэширование определенного блока:
Добавьте приведенный ниже код в имя темы_.тема файл
function theme_name_preprocess_block(&$variables) {
if ($variables['plugin_id'] == 'block_id') {
$variables['#cache']['max-age'] = 0;
}
}
Чтобы отключить кэш для типа блока, предварительно обработайте блок этого типа и установите значение max_age равным 0.
/**
* Implements hook_preprocess_HOOK() for Block document templates.
*/
function THEMENAME_preprocess_block(array &$variables) {
//disbale cache from spotlight
$content = $variables['elements']['content'];
//dump($content); //check the contents
if (isset($content['#block_content']) && $content['#block_content'] instanceof BlockContentInterface) {
if ($content['#block_content']->bundle() == 'BLOCK_TYPE') {
$variables['#cache']['max-age'] = 0;
}
}
}