Drupal 9:如何禁用特定页面的缓存

Posted

技术标签:

【中文标题】Drupal 9:如何禁用特定页面的缓存【英文标题】:Drupal 9 : How to disable cache for a specific page 【发布时间】:2022-01-15 17:11:20 【问题描述】:

如何在 Drupal 9 中禁用特定页面的缓存, 我找到了一个解决方案,但是它用于禁用所有页面的缓存,解决方案是:在settings.yml中添加此代码:

assert_options(ASSERT_ACTIVE, TRUE);
\Drupal\Component\Assertion\Handle::register();
$settings['container_yamls'][] = DRUPAL_ROOT . '/sites/development.services.yml';
$settings['cache']['bins']['render'] = 'cache.backend.null';
$settings['cache']['bins']['page'] = 'cache.backend.null';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.null';

这是可行的,但我只想禁用特定页面的缓存。 谢谢。

【问题讨论】:

【参考方案1】:

在您页面的 my_company.routing.yml 配置文件中,您可以添加以下 options.no_cache 属性:

my_company.customer_detail:
  path: '/customer/customer_entity/detail'
  defaults:
    _controller: '\Drupal\my_company\Controller\CustomerController::detailAction'
    _title: 'Fiche client'
  requirements:
    _permission: 'access content'
    type: ^\d+
  options:
    no_cache: 'TRUE'

【讨论】:

只有在存在自定义控制器的情况下才会起作用。如果这是一个查看内容类型的简单页面,那么应该有另一种方法,比如在预处理钩子中禁用缓存,或者在需要时使用特定标签进行缓存更新【参考方案2】:

您可以使用hook_preprocess_HOOK 来禁用缓存。比如:

function test_module_preprocess_node__landing_page(&$variables) 
  $variables['#cache']['max-age'] = 0;

test_module 是您的模块名称,node 是您的实体类型,landing_page 是您的内容类型名称。 这个钩子应该放在你的模块 .module 文件中。

另外,我建议您查看Cache API 文章,在那里您可以找到如何控制您的网站的缓存以及如何使用缓存上下文和标签

【讨论】:

以上是关于Drupal 9:如何禁用特定页面的缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖Drupal 7上的“禁用JavaScript”页面

Drupal - 如何在“编辑内容”中隐藏数据

php 禁用gzip,minify,缓存,性能,正常运行时间,smush,gravatar,特定页面上的页面缓存等模块

Drupal 8/9 模块发布后没有刷新表单数据

如何禁用drupal 7中的链接?

Drupal 7 列出当前用户所属的有机组