Как отключить кэш веток и блоков для определенного модуля?


Я работаю над модулем в Drupal 8, который извлекает данные, зависящие от времени, из внешнего REST api. Данные обрабатываются и передаются в Блок. Окончательные данные отправляются в шаблон ветки следующим образом:

...

public function build() {
  $build = [];

  $build['ticker_block'] = [
    '#theme' => 'module_theme',
    '#data' => $myService->data(),
  ];

  return $build;
}

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

Author: kiamlaluno, 2015-12-29

5 answers

Вы можете управлять кэшем в массиве визуализации с помощью элемента #cache.

Чтобы отключить кэш, добавьте:

$build['#cache']['max-age'] = 0;

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

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

Отключите его либо полностью удалив модуль page_cache, либо включив переключатель отключения, см. Как я могу предотвратить появление определенной страницы кэшированный? например.

Кэширование кода ветки не связано с этим, код ветки кэшируется только один раз, в первый раз, когда он используется после очистки кэша.

(редактировать в соответствии с комментариями Бердира)

 28
Author: 4k4, 2017-04-13 12:47:02

Чтобы остановить кэширование определенного блока, используйте следующую функцию:

/**
 * 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;
  }
}
 8
Author: echo, 2020-01-15 19:04:52

Отключить кэш для определенной страницы/типа контента/контроллера

Отключите кэш для пользовательской страницы из объявления маршрута.

Если вы хотите отключить кэш для пользовательского контроллера (пользовательского модуля), у вас есть no_cache опция (ВАШ_МОДУЛЬ.маршрутизация.yml). Пример: Файл : mymodule.routing.yml

мой модуль.маршрутизация.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", чтобы пометить ответы маршрута как недоступные для кэширования

 5
Author: Vladislav, 2017-11-10 07:48:58

Чтобы предотвратить кэширование определенного блока:

Добавьте приведенный ниже код в имя темы_.тема файл

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}
 1
Author: Rimi B, 2019-06-20 14:22:49

Чтобы отключить кэш для типа блока, предварительно обработайте блок этого типа и установите значение 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;
        }

      }


    }
 1
Author: Kashmiri, 2020-02-03 05:49:17