我有一个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
答案 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,
],