Як відключити Twig і заблокувати кеш-пам'ять для конкретного модуля?


15

Я працюю над модулем в Drupal 8, який витягує часові дані із зовнішнього програмного забезпечення REST. Дані обробляються та передаються до Блоку. Кінцеві дані надсилаються в шаблон Twig так:

...

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

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

  return $build;
}

Це не працює у виробничому середовищі, коли кеш увімкнено, а відображені дані відображаються як несвіжі. Як я відключу кеш лише для мого модуля, і чи потрібно це робити як для шаблону Twig, так і для блоку модуля?

Відповіді:


27

Ви можете керувати кешем у масиві візуалізації за допомогою елемента #cache.

Щоб відключити кеш, додайте:

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

У цьому випадку блок не буде кешований для ввійшли користувачів або анонімних користувачів із сеансом.

Якщо ви хочете відключити кеш для анонімних користувачів без сеансу:

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

Кешування коду twig до цього не підключено, twig-код кешується лише один раз, перший раз він використовується після очищення кеша.

(редагувати відповідно до коментарів Бердіра)


Я думаю, що контекст кешу не допоможе в цьому конкретному випадку, але, можливо, ви хочете використовувати фактичний максимальний вік замість 0, який повністю відключив кешування, як 60. Не впевнений, наскільки ваші дані залежать від часу, але, як правило, речі можуть кешувати хвилину або кілька. Також зауважте, що максимальний вік не впливає на кеш анонімної сторінки. Якщо вам це потрібно для анонімних користувачів, вам потрібно це повністю відключити або отримати дані за допомогою JavaScript.
Бердір

@Berdir: Я використовую max-age = 0 для анонімних користувачів, але з сеансами. Це працює зараз у розробці. Як ви вважаєте, це нормально для виробництва? Що ви маєте на увазі під час відключення повністю?
4k4

Це добре, якщо у вас є сеанси, то це працює. Вимкніть його або повністю видаливши модуль page_cache повністю, або запустивши перемикач на знищення, див ., Наприклад , drupal.stackexchange.com/questions/151254/… .
Бердір

Дякую за чудову інформацію, я додав це у відповідь.
4k4

1
$ build ['# cache'] ['max-age'] = 0; зробив трюк !!! Пиво кругле! :)
Сорін

6

Щоб зупинити кешування конкретного блоку, використовуйте наступну функцію:

/**
 * 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;
  }
}

Відмінна відповідь.
Учень

2

Вимкнути кеш-пам'ять для певної сторінки / типу вмісту / контролера

Вимкнути кеш для спеціальної сторінки з оголошення маршруту.

Якщо ви хочете відключити кеш для користувальницького контролера (Спеціальний модуль), у вас є no_cacheваріант (YOUR_MODULE.routing.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", щоб позначити відповіді маршруту як неможливі кешування


0

Щоб запобігти кешування певного блоку:

додати код нижче у файл topic_name.theme

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}

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;
        }

      }


    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.