2017-11-21 5 views
0

Ich habe ein Problem mit Drupal 8. Ich auf diese Weise einen Render-Array cachen versuchen:Drupal 8 Problem mit Caching machen Array

$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, 
    ], 
]; 

ich es am Ende einer Controller-Methode Rückkehr zu einer Route gebunden um eine Liste von Meetings zu sehen.

Leider benutze die Seite nie mein maximales Alter (60 Sekunden).

Wenn ich

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

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

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

und gebe die Antwort, wird die Seite erfolgreich mit der guten max-age zwischengespeichert, aber nicht das Thema Vorlage verwenden, und daher ohne Stil und Seiten-Markup erscheinen.

Könnten Sie mir bitte helfen, eine Lösung zu finden: entweder gelingt es, das Render-Array zwischenzuspeichern oder die Antwort in meinem Thema zu rendern.

Best,

PF

+0

Ich glaube, ich könnte die Lösung gefunden haben. Innerhalb eines Renderarrays müssen Sie jedes untergeordnete Objekt (#children) zwischenspeichern, dh ein Cache-Array im Renderarray für jede Ebene Ihres Renderarrays erstellen. Daher habe ich eine cacheID basierend auf Abfrageparametern und Level (innerhalb der Schleife) erstellt und diese cid als Cache-Schlüssel verwendet. '$ cid = 'api:'. \ Drupal :: languageManager() -> getCurrentLanguage() -> getId(). ': Treffen:'. http_build_query ($ paramters, '', ':'); 'für das Eltern-Array, zum Beispiel. Ich werde den Thread aktualisieren, während ich weitere Tests mache. –

+0

Alles scheint in Ordnung zu sein. Mein letztes Problem ist, dass die gleiche Seite aber von einem Formular aus einreichen nicht zwischengespeichert wird. Ich werde ermitteln. –

Antwort

0

Ich glaube, ich könnte die Lösung gefunden haben. Innerhalb eines Renderarrays müssen Sie jedes untergeordnete Objekt (#children) zwischenspeichern, dh ein Cache-Array im Renderarray für jede Ebene Ihres Renderarrays erstellen. Daher habe ich eine cacheID basierend auf Abfrageparametern und Level (innerhalb der Schleife) erstellt und diese cid als Cache-Schlüssel verwendet.

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

für das übergeordnete Array, als Beispiel.

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

und in den Kindern

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