diff --git a/core/lib/Drupal/Core/Render/Placeholder/CachedStrategy.php b/core/lib/Drupal/Core/Render/Placeholder/CachedStrategy.php index 941c11ac27ebe02bec8b6392f42c264e685d3001..757f647e5f0a178810835149f72f962683759364 100644 --- a/core/lib/Drupal/Core/Render/Placeholder/CachedStrategy.php +++ b/core/lib/Drupal/Core/Render/Placeholder/CachedStrategy.php @@ -21,7 +21,41 @@ public function __construct( * {@inheritdoc} */ public function processPlaceholders(array $placeholders) { - return $this->renderCache->getMultiple($placeholders); + $return = $this->renderCache->getMultiple($placeholders); + if ($return) { + $return = $this->processNestedPlaceholders($return); + } + + return $return; + } + + /** + * Fetch any nested placeholders from cache. + * + * Placeholders returned from cache may have placeholders in #attached, which + * can themselves be fetched from the cache. By recursively processing the + * placeholders here, we're able to use multiple cache get to fetch the cache + * items at each level of recursion. + */ + private function processNestedPlaceholders(array $placeholders): array { + $sets = []; + foreach ($placeholders as $key => $placeholder) { + if (!empty($placeholder['#attached']['placeholders'])) { + $sets[] = $placeholder['#attached']['placeholders']; + } + } + if ($sets) { + $cached = $this->renderCache->getMultiple(...array_merge($sets)); + if ($cached) { + $cached = $this->processNestedPlaceholders($cached); + foreach ($placeholders as $key => $placeholder) { + if (!empty($placeholder['#attached']['placeholders'])) { + $placeholders[$key]['#attached']['placeholders'] = array_replace($placeholder['#attached']['placeholders'], $cached); + } + } + } + } + return $placeholders; } } diff --git a/core/modules/navigation/tests/src/FunctionalJavascript/PerformanceTest.php b/core/modules/navigation/tests/src/FunctionalJavascript/PerformanceTest.php index 3264d769c195b30c90ac75c17cfc939ff97ce040..f1ca3242a2a8263e63317751e0c7f38eaee21d40 100644 --- a/core/modules/navigation/tests/src/FunctionalJavascript/PerformanceTest.php +++ b/core/modules/navigation/tests/src/FunctionalJavascript/PerformanceTest.php @@ -73,14 +73,14 @@ public function testLogin(): void { $expected = [ 'QueryCount' => 4, - 'CacheGetCount' => 49, + 'CacheGetCount' => 48, 'CacheGetCountByBin' => [ 'config' => 11, 'data' => 4, 'discovery' => 10, 'bootstrap' => 6, 'dynamic_page_cache' => 1, - 'render' => 16, + 'render' => 15, 'menu' => 1, ], 'CacheSetCount' => 2,