2017-11-21 14 views
0

私はdrupalの私は、このようにレンダリング配列をキャッシュしようとしています8.に問題があります会議のリストを見る。のDrupal 8の問題レンダリング配列

悲しいことに、このページでは最大年齢(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); 

を使用して応答を返すとき

、ページが正常に良い最大エージングでキャッシュされているが、テーマのテンプレートを使用するため、スタイルやページのマークアップなしで表示されません。

解決策を見つける手助けをしてください:レンダリング配列のキャッシュに成功するか、テーマ内でレスポンスを成功させてください。

ベスト、

PF

+0

私は解決策を見つけたかもしれないと思います。レンダリング配列内では、すべての子(#children)をキャッシュする必要があります。つまり、レンダー配列のすべてのレベルのレンダ配列にキャッシュ配列を作成します。したがって、クエリパラメータとレベル(ループ内)に基づいてcacheIDを作成し、このcidをキャッシュキーとして使用しました。 '$ cid = 'api:'。 \ Drupal :: languageManager() - > getCurrentLanguage() - > getId()。 ':ミーティング:' http_build_query($ parameters、 ''、 ':'); '例では、親配列の場合。私は、より多くのテストをしながらスレッドを更新したままにします。 –

+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, 
],