2017-11-21 10 views
0

나는 드루팔 내가 이런 식으로 렌더링 배열을 캐시하려고 8.에 문제가 회의 목록을 볼 수 있습니다.드루팔 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, 
],