Verified Commit b3238209 authored by Dave Long's avatar Dave Long
Browse files

Issue #3513928 by catch, kristiaanvandeneynde: Recursively replace placeholders in CachedStrategy

parent 0b47ac36
Loading
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -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;
  }

}
+2 −2
Original line number Diff line number Diff line
@@ -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,