如何禁用Twig并阻止特定模块的缓存?


15

我正在使用Drupal 8中的一个模块,该模块从外部REST API中检索对时间敏感的数据。数据被处理并转发到块。最终数据将发送到Twig模板,如下所示:

...

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

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

  return $build;
}

这在启用了缓存且呈现的数据显示为过时的生产环境中不起作用。如何仅对我的模块禁用缓存,我是否必须对Twig模板和Block插件都进行缓存?

Answers:


27

您可以使用#cache元素控制渲染数组中的缓存。

要禁用缓存,请添加:

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

在这种情况下,不会为登录的用户或具有会话的匿名用户缓存该块。

如果要为没有会话的匿名用户禁用缓存:

通过完全卸载page_cache模块或通过触发kill开关来禁用它,请参阅 如何防止特定页面被缓存?例如。

细枝代码的缓存与此没有关联,细枝代码仅被缓存一次,这是在清除缓存后第一次使用它。

(根据Berdir的评论进行编辑)


我想在这种特定情况下缓存上下文无济于事,但是也许您想使用实际的max-age而不是0来完全禁用缓存(例如60)。不确定数据对时间的敏感程度,但通常情况下缓存一分钟或几分钟。另外,请注意max-age不会影响匿名页面缓存。如果匿名用户需要此功能,则需要完全禁用它或使用javascript获取数据。
贝迪尔(Berdir)2015年

@Berdir:我对匿名用户使用max-age = 0,但使用了会话。现在正在开发中。您认为这样可以生产吗?完全禁用意味着什么?
2015年

如果您有会议,那就很好了。通过完全卸载page_cache模块或通过触发kill开关来禁用它,例如,请参阅drupal.stackexchange.com/questions/151254/…
贝尔迪尔

感谢您提供的详细信息,我已在答案中添加了此信息。
2015年

1
$ build ['#cache'] ['max-age'] = 0; 做到了!啤酒全能!:)
Sorin

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

为了防止缓存特定的块:

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

      }


    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.