From 27c9bcca6f2203b25ff5f7de88c0984f0315518e Mon Sep 17 00:00:00 2001
From: Dave Long <dave@longwaveconsulting.com>
Date: Fri, 7 Jun 2024 23:32:48 +0100
Subject: [PATCH] Issue #3445909 by seanB, smustgrave, alexpott, catch: Add
 static caching to LayoutTempstoreRepository

---
 .../src/LayoutTempstoreRepository.php         | 26 +++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/core/modules/layout_builder/src/LayoutTempstoreRepository.php b/core/modules/layout_builder/src/LayoutTempstoreRepository.php
index 36b78948b361..75c655cdf463 100644
--- a/core/modules/layout_builder/src/LayoutTempstoreRepository.php
+++ b/core/modules/layout_builder/src/LayoutTempstoreRepository.php
@@ -16,6 +16,13 @@ class LayoutTempstoreRepository implements LayoutTempstoreRepositoryInterface {
    */
   protected $tempStoreFactory;
 
+  /**
+   * The static cache of loaded values.
+   *
+   * @var \Drupal\layout_builder\SectionStorageInterface[]
+   */
+  protected array $cache = [];
+
   /**
    * LayoutTempstoreRepository constructor.
    *
@@ -31,6 +38,12 @@ public function __construct(SharedTempStoreFactory $temp_store_factory) {
    */
   public function get(SectionStorageInterface $section_storage) {
     $key = $this->getKey($section_storage);
+
+    // Check if the storage is present in the static cache.
+    if (isset($this->cache[$key])) {
+      return $this->cache[$key];
+    }
+
     $tempstore = $this->getTempstore($section_storage)->get($key);
     if (!empty($tempstore['section_storage'])) {
       $storage_type = $section_storage->getStorageType();
@@ -39,6 +52,9 @@ public function get(SectionStorageInterface $section_storage) {
       if (!($section_storage instanceof SectionStorageInterface)) {
         throw new \UnexpectedValueException(sprintf('The entry with storage type "%s" and ID "%s" is invalid', $storage_type, $key));
       }
+
+      // Set the storage in the static cache.
+      $this->cache[$key] = $section_storage;
     }
     return $section_storage;
   }
@@ -48,6 +64,12 @@ public function get(SectionStorageInterface $section_storage) {
    */
   public function has(SectionStorageInterface $section_storage) {
     $key = $this->getKey($section_storage);
+
+    // Check if the storage is present in the static cache.
+    if (isset($this->cache[$key])) {
+      return TRUE;
+    }
+
     $tempstore = $this->getTempstore($section_storage)->get($key);
     return !empty($tempstore['section_storage']);
   }
@@ -58,6 +80,8 @@ public function has(SectionStorageInterface $section_storage) {
   public function set(SectionStorageInterface $section_storage) {
     $key = $this->getKey($section_storage);
     $this->getTempstore($section_storage)->set($key, ['section_storage' => $section_storage]);
+    // Update the storage in the static cache.
+    $this->cache[$key] = $section_storage;
   }
 
   /**
@@ -66,6 +90,8 @@ public function set(SectionStorageInterface $section_storage) {
   public function delete(SectionStorageInterface $section_storage) {
     $key = $this->getKey($section_storage);
     $this->getTempstore($section_storage)->delete($key);
+    // Remove the storage from the static cache.
+    unset($this->cache[$key]);
   }
 
   /**
-- 
GitLab