Drupal 8缓存渲染数组

时间:2017-11-21 16:18:12

标签: caching drupal-8

我有一个drupal 8的问题。我试图以这种方式缓存渲染数组:

$meetingsView = [
    '#theme' => 'meetings_view',
    '#meetings_view' => $meetings,
    '#months' => $this->monthsArray,
    '#sidebar' => [
    '#theme' => 'meetings_sidebar',
        '#search_meetings_form' => $searchMeetingsForm,
    ],
    '#language' => $language,
    '#children' => $meetingRows,
    '#attached' => [
        'library' => [
            'my_module/my_module',
        ],
        'drupalSettings' => [
            'siteUrl' => $base_url,
        ],
    ],
    '#cache' => [
        'keys' => ['meeting_views'],
        'context' => [],
        'tags' => ['http_response'],
        'max-age' => 60,
    ],
];

我在绑定到路径的控制器方法的末尾返回它以查看会议列表。

可悲的是,页面从不使用我的最大年龄(60秒)。

当我使用

$cacheMetadata = new CacheableMetadata();
$cacheMetadata->setCacheContexts([]);
$cacheMetadata->setCacheMaxAge(60);
$cacheMetadata->setCacheTags([]);

$markup = $renderer->renderRoot($meetingsView);

$response = new HtmlResponse($markup, Response::HTTP_OK);
$response->addCacheableDependency($cacheMetadata);

并返回响应,页面已成功缓存并具有良好的max-age但不使用主题模板,因此没有样式和页面标记。

请你帮我找一个解决方案:要么成功缓存渲染数组,要么成功在我的主题中呈现响应。

最佳,

PF

1 个答案:

答案 0 :(得分:0)

我想我可能已经找到了解决方案。在渲染数组中,您必须缓存每个子节点(#children),这意味着在渲染数组中为渲染数组的每个级别创建一个缓存数组。因此,我根据查询参数和级别(在循环内)创建了一个cacheID,并将此cid用作缓存键。

$cid = 'api:' . \Drupal::languageManager()->getCurrentLanguage()->getId() . ':meetings:' . http_build_query($parameters, '', ':');
例如,

用于父数组。

'#cache' => [
  'keys' => [$cid],
  'context' => [],
  'tags' => ['http_response'],
  'max-age' => $cache_expire,
],

和孩子们

'#cache' => [
  'keys' => [
    $cid,
    'meeting_rows:' . $i,
  ],
  'context' => [],
  'tags' => ['http_response'],
  'max-age' => $cache_expire,
],