core/lib/Drupal/Core/Cache/Cache.php | 28 --------------- core/lib/Drupal/Core/Cache/DatabaseBackend.php | 36 +++++++++++++++++--- core/lib/Drupal/Core/Cache/MemoryBackend.php | 34 ++++++++++++++++-- .../Core/EventSubscriber/HtmlViewSubscriber.php | 26 +++++++++++++- .../system/Tests/Bootstrap/PageCacheTest.php | 2 +- 5 files changed, 89 insertions(+), 37 deletions(-) diff --git a/core/lib/Drupal/Core/Cache/Cache.php b/core/lib/Drupal/Core/Cache/Cache.php index feb3c77..c2f5fe6 100644 --- a/core/lib/Drupal/Core/Cache/Cache.php +++ b/core/lib/Drupal/Core/Cache/Cache.php @@ -70,32 +70,4 @@ public static function getBins() { return $bins; } - /** - * 'Flattens' a tags array into an array of strings. - * - * @param array $tags - * Associative array of tags to flatten. - * - * @return array - * An indexed array of flattened tag identifiers. - */ - public static function flattenTags(array $tags) { - if (isset($tags[0])) { - return $tags; - } - - $flat_tags = array(); - foreach ($tags as $namespace => $values) { - if (is_array($values)) { - foreach ($values as $value) { - $flat_tags[] = "$namespace:$value"; - } - } - else { - $flat_tags[] = "$namespace:$values"; - } - } - return $flat_tags; - } - } diff --git a/core/lib/Drupal/Core/Cache/DatabaseBackend.php b/core/lib/Drupal/Core/Cache/DatabaseBackend.php index ad873e6..4f98c50 100644 --- a/core/lib/Drupal/Core/Cache/DatabaseBackend.php +++ b/core/lib/Drupal/Core/Cache/DatabaseBackend.php @@ -163,7 +163,7 @@ public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = array * Actually set the cache. */ protected function doSet($cid, $data, $expire, $tags) { - $flat_tags = Cache::flattenTags($tags); + $flat_tags = $this->flattenTags($tags); $deleted_tags = &drupal_static('Drupal\Core\Cache\DatabaseBackend::deletedTags', array()); $invalidated_tags = &drupal_static('Drupal\Core\Cache\DatabaseBackend::invalidatedTags', array()); // Remove tags that were already deleted or invalidated during this request @@ -237,7 +237,7 @@ public function deleteMultiple(array $cids) { public function deleteTags(array $tags) { $tag_cache = &drupal_static('Drupal\Core\Cache\CacheBackendInterface::tagCache', array()); $deleted_tags = &drupal_static('Drupal\Core\Cache\DatabaseBackend::deletedTags', array()); - foreach (Cache::flattenTags($tags) as $tag) { + foreach ($this->flattenTags($tags) as $tag) { // Only delete tags once per request unless they are written again. if (isset($deleted_tags[$tag])) { continue; @@ -307,7 +307,7 @@ public function invalidateTags(array $tags) { try { $tag_cache = &drupal_static('Drupal\Core\Cache\CacheBackendInterface::tagCache', array()); $invalidated_tags = &drupal_static('Drupal\Core\Cache\DatabaseBackend::invalidatedTags', array()); - foreach (Cache::flattenTags($tags) as $tag) { + foreach ($this->flattenTags($tags) as $tag) { // Only invalidate tags once per request unless they are written again. if (isset($invalidated_tags[$tag])) { continue; @@ -358,6 +358,34 @@ public function garbageCollection() { } /** + * 'Flattens' a tags array into an array of strings. + * + * @param array $tags + * Associative array of tags to flatten. + * + * @return array + * An indexed array of flattened tag identifiers. + */ + protected function flattenTags(array $tags) { + if (isset($tags[0])) { + return $tags; + } + + $flat_tags = array(); + foreach ($tags as $namespace => $values) { + if (is_array($values)) { + foreach ($values as $value) { + $flat_tags[] = "$namespace:$value"; + } + } + else { + $flat_tags[] = "$namespace:$values"; + } + } + return $flat_tags; + } + + /** * Returns the sum total of validations for a given set of tags. * * @param array $tags @@ -366,7 +394,7 @@ public function garbageCollection() { * @return int * Sum of all invalidations. * - * @see \Drupal\Core\Cache\Cache::flattenTags() + * @see \Drupal\Core\Cache\DatabaseBackend::flattenTags() */ protected function checksumTags($flat_tags) { $tag_cache = &drupal_static('Drupal\Core\Cache\CacheBackendInterface::tagCache', array()); diff --git a/core/lib/Drupal/Core/Cache/MemoryBackend.php b/core/lib/Drupal/Core/Cache/MemoryBackend.php index c571a5e..a7faca6 100644 --- a/core/lib/Drupal/Core/Cache/MemoryBackend.php +++ b/core/lib/Drupal/Core/Cache/MemoryBackend.php @@ -101,7 +101,7 @@ public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = array 'data' => $data, 'created' => REQUEST_TIME, 'expire' => $expire, - 'tags' => Cache::flattenTags($tags), + 'tags' => $this->flattenTags($tags), ); } @@ -123,7 +123,7 @@ public function deleteMultiple(array $cids) { * Implements Drupal\Core\Cache\CacheBackendInterface::deleteTags(). */ public function deleteTags(array $tags) { - $flat_tags = Cache::flattenTags($tags); + $flat_tags = $this->flattenTags($tags); foreach ($this->cache as $cid => $item) { if (array_intersect($flat_tags, $item->tags)) { unset($this->cache[$cid]); @@ -160,7 +160,7 @@ public function invalidateMultiple(array $cids) { * Implements Drupal\Core\Cache\CacheBackendInterface::invalidateTags(). */ public function invalidateTags(array $tags) { - $flat_tags = Cache::flattenTags($tags); + $flat_tags = $this->flattenTags($tags); foreach ($this->cache as $cid => $item) { if (array_intersect($flat_tags, $item->tags)) { $this->cache[$cid]->expire = REQUEST_TIME - 1; @@ -178,6 +178,34 @@ public function invalidateAll() { } /** + * 'Flattens' a tags array into an array of strings. + * + * @param array $tags + * Associative array of tags to flatten. + * + * @return array + * An indexed array of strings. + */ + protected function flattenTags(array $tags) { + if (isset($tags[0])) { + return $tags; + } + + $flat_tags = array(); + foreach ($tags as $namespace => $values) { + if (is_array($values)) { + foreach ($values as $value) { + $flat_tags["$namespace:$value"] = "$namespace:$value"; + } + } + else { + $flat_tags["$namespace:$values"] = "$namespace:$values"; + } + } + return $flat_tags; + } + + /** * Implements Drupal\Core\Cache\CacheBackendInterface::isEmpty(). */ public function isEmpty() { diff --git a/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php index 5bcaabf..c71d86a 100644 --- a/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php @@ -77,7 +77,7 @@ public function onHtmlPage(GetResponseForControllerResultEvent $event) { // recommended. $response = new Response((string) $this->pageRenderer->render($page), $page->getStatusCode()); if ($tags = $page->getCacheTags()) { - $response->headers->set('X-Drupal-Cache-Tags', implode(' ', \Drupal\Core\Cache\Cache::flattenTags($tags))); + $response->headers->set('X-Drupal-Cache-Tags', $this->flattenCacheTags($tags)); } if ($keys = $page->getCacheKeys()) { $response->headers->set('cache_keys', serialize($keys)); @@ -105,4 +105,28 @@ static function getSubscribedEvents() { return $events; } + /** + * 'Flattens' a tags array into an array of strings. + * + * @param array $tags + * Associative array of cache tags to flatten. + * + * @return string + * A space-separated liste of flattened cache tag identifiers. + */ + protected function flattenCacheTags(array $tags) { + $flat_tags = array(); + foreach ($tags as $namespace => $values) { + if (is_array($values)) { + foreach ($values as $value) { + $flat_tags[] = "$namespace:$value"; + } + } + else { + $flat_tags[] = "$namespace:$values"; + } + } + return implode(' ', $flat_tags); + } + } diff --git a/core/modules/system/lib/Drupal/system/Tests/Bootstrap/PageCacheTest.php b/core/modules/system/lib/Drupal/system/Tests/Bootstrap/PageCacheTest.php index 45a94e9..056a908 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Bootstrap/PageCacheTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Bootstrap/PageCacheTest.php @@ -66,7 +66,7 @@ function testPageCacheTags() { $cid = sha1(implode(':', $cid_parts)); $cache_entry = \Drupal::cache('page')->get($cid); sort($cache_entry->tags); - $this->assertIdentical($cache_entry->tags, array('content:1', 'system_test_cache_tags_page:1', 'pre_render:1')); + $this->assertIdentical($cache_entry->tags, array('content:1', 'pre_render:1', 'system_test_cache_tags_page:1')); Cache::invalidateTags($tags); $this->drupalGet($path);