diff --git a/core/lib/Drupal/Core/Cache/RuntimeCacheableDependencyInterface.php b/core/lib/Drupal/Core/Cache/RuntimeCacheableDependencyInterface.php new file mode 100644 index 0000000..03d88d4 --- /dev/null +++ b/core/lib/Drupal/Core/Cache/RuntimeCacheableDependencyInterface.php @@ -0,0 +1,41 @@ +cacheContexts; } /** * {@inheritdoc} */ public function getCacheTags() { - return ['config:' . $this->name]; + return Cache::mergeTags(['config:' . $this->name], $this->cacheTags); } /** * {@inheritdoc} */ public function getCacheMaxAge() { - return Cache::PERMANENT; + return $this->cacheMaxAge; + } + + /** + * {@inheritdoc} + */ + public function addRuntimeCacheContexts(array $cache_contexts) { + $this->cacheContexts = Cache::mergeContexts($this->cacheContexts, $cache_contexts); + } + + /** + * {@inheritdoc} + */ + public function addRuntimeCacheTags(array $cache_tags) { + $this->cacheTags = Cache::mergeTags($this->cacheTags, $cache_tags); + } + + /** + * {@inheritdoc} + */ + public function setRuntimeCacheMaxAge($max_age) { + $this->cacheMaxAge = Cache::mergeMaxAges($this->cacheMaxAge, $max_age); } } diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php index cdfd951..b295297 100644 --- a/core/lib/Drupal/Core/Config/ConfigFactory.php +++ b/core/lib/Drupal/Core/Config/ConfigFactory.php @@ -9,6 +9,8 @@ use Drupal\Component\Utility\NestedArray; use Drupal\Core\Cache\Cache; +use Drupal\Core\Cache\Context\CacheContextInterface; +use Drupal\Core\Cache\RuntimeCacheableDependencyInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -126,6 +128,10 @@ protected function doGet($name, $immutable = TRUE) { $this->cache[$cache_key]->setSettingsOverride($GLOBALS['config'][$name]); } } + + // Propagate cache contexts to the config object. + $this->propagateCacheableDependencyOverrides($cache_key); + return $this->cache[$cache_key]; } } @@ -183,6 +189,10 @@ protected function doLoadMultiple(array $names, $immutable = TRUE) { $this->cache[$cache_key]->setSettingsOverride($GLOBALS['config'][$name]); } } + + // Propagate cacheable dependencies to the config object. + $this->propagateCacheableDependencyOverrides($cache_key); + $list[$name] = $this->cache[$cache_key]; } } @@ -210,6 +220,20 @@ protected function loadOverrides(array $names) { } /** + * Propagates overridden cacheable dependencies to cached config objects. + * + * @param string $cache_key + * The key of the cached config object to update. + */ + protected function propagateCacheableDependencyOverrides($cache_key) { + foreach ($this->configFactoryOverrides as $override) { + $this->cache[$cache_key]->addRuntimeCacheContexts($override->getCacheContexts()); + $this->cache[$cache_key]->addRuntimeCacheTags($override->getCacheTags()); + $this->cache[$cache_key]->setRuntimeCacheMaxAge($override->getCacheMaxAge()); + } + } + + /** * {@inheritdoc} */ public function reset($name = NULL) { diff --git a/core/lib/Drupal/Core/Config/ConfigFactoryOverrideInterface.php b/core/lib/Drupal/Core/Config/ConfigFactoryOverrideInterface.php index 56dbc19..7b07c1a 100644 --- a/core/lib/Drupal/Core/Config/ConfigFactoryOverrideInterface.php +++ b/core/lib/Drupal/Core/Config/ConfigFactoryOverrideInterface.php @@ -7,10 +7,12 @@ namespace Drupal\Core\Config; +use Drupal\Core\Cache\CacheableDependencyInterface; + /** * Defines the interface for a configuration factory override object. */ -interface ConfigFactoryOverrideInterface { +interface ConfigFactoryOverrideInterface extends CacheableDependencyInterface { /** * Returns config overrides. diff --git a/core/modules/config/src/Tests/CacheContextConfigOverrideTest.php b/core/modules/config/src/Tests/CacheContextConfigOverrideTest.php new file mode 100644 index 0000000..90aee2a --- /dev/null +++ b/core/modules/config/src/Tests/CacheContextConfigOverrideTest.php @@ -0,0 +1,43 @@ +container->get('config.factory'); + $config = $config_factory->get('system.theme'); + + // Check that we are using the Pirate theme. + $theme = $config->get('default'); + $this->assertEqual('pirate', $theme); + + // Check that the cacheable properties are correct. + $this->assertEqual(['pirate_day'], $config->getCacheContexts()); + $this->assertEqual(['config:system.theme', 'pirate-day-tag'], $config->getCacheTags()); + $this->assertEqual(PirateDayCacheContext::PIRATE_DAY_MAX_AGE, $config->getCacheMaxAge()); + } + +} diff --git a/core/modules/config/tests/config_entity_static_cache_test/src/ConfigOverrider.php b/core/modules/config/tests/config_entity_static_cache_test/src/ConfigOverrider.php index 2867c7d..8dad5bb 100644 --- a/core/modules/config/tests/config_entity_static_cache_test/src/ConfigOverrider.php +++ b/core/modules/config/tests/config_entity_static_cache_test/src/ConfigOverrider.php @@ -7,6 +7,7 @@ namespace Drupal\config_entity_static_cache_test; +use Drupal\Core\Cache\Cache; use Drupal\Core\Config\ConfigFactoryOverrideInterface; use Drupal\Core\Config\StorageInterface; @@ -40,4 +41,25 @@ public function createConfigObject($name, $collection = StorageInterface::DEFAUL return NULL; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return []; + } + + /** + * {@inheritdoc} + */ + public function getCacheTags() { + return []; + } + + /** + * {@inheritdoc} + */ + public function getCacheMaxAge() { + return Cache::PERMANENT; + } + } diff --git a/core/modules/config/tests/config_override_test/config_override_test.services.yml b/core/modules/config/tests/config_override_test/config_override_test.services.yml index c3fae64..886b7fd 100644 --- a/core/modules/config/tests/config_override_test/config_override_test.services.yml +++ b/core/modules/config/tests/config_override_test/config_override_test.services.yml @@ -1,4 +1,8 @@ services: + cache_context.pirate_day: + class: Drupal\config_override_test\Cache\PirateDayCacheContext + tags: + - { name: cache.context } config_override_test.overrider: class: Drupal\config_override_test\ConfigOverrider tags: @@ -7,3 +11,7 @@ services: class: Drupal\config_override_test\ConfigOverriderLowPriority tags: - { name: config.factory.override, priority: -100 } + config_override_test.pirate_day_cache_context_overrider: + class: Drupal\config_override_test\PirateDayCacheContextConfigOverride + tags: + - { name: config.factory.override } diff --git a/core/modules/config/tests/config_override_test/src/Cache/PirateDayCacheContext.php b/core/modules/config/tests/config_override_test/src/Cache/PirateDayCacheContext.php new file mode 100644 index 0000000..80e6000 --- /dev/null +++ b/core/modules/config/tests/config_override_test/src/Cache/PirateDayCacheContext.php @@ -0,0 +1,52 @@ + ['default' => 'pirate']]; + } + + return $overrides; + } + + /** + * {@inheritdoc} + */ + public function getCacheSuffix() { + return 'PirateDayConfigOverrider'; + } + + /** + * {@inheritdoc} + */ + public function createConfigObject($name, $collection = StorageInterface::DEFAULT_COLLECTION) { + return NULL; + } + + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return ['pirate_day']; + } + + /** + * {@inheritdoc} + */ + public function getCacheTags() { + return ['pirate-day-tag']; + } + + /** + * {@inheritdoc} + */ + public function getCacheMaxAge() { + return PirateDayCacheContext::PIRATE_DAY_MAX_AGE; + } + +} diff --git a/core/modules/language/src/Config/LanguageConfigFactoryOverride.php b/core/modules/language/src/Config/LanguageConfigFactoryOverride.php index 3d0a67b..e2e8c3b 100644 --- a/core/modules/language/src/Config/LanguageConfigFactoryOverride.php +++ b/core/modules/language/src/Config/LanguageConfigFactoryOverride.php @@ -7,6 +7,7 @@ namespace Drupal\language\Config; +use Drupal\Core\Cache\Cache; use Drupal\Core\Config\ConfigCollectionInfo; use Drupal\Core\Config\ConfigCrudEvent; use Drupal\Core\Config\ConfigFactoryOverrideBase; @@ -222,4 +223,25 @@ public function onConfigDelete(ConfigCrudEvent $event) { } } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return ['languages:language_interface']; + } + + /** + * {@inheritdoc} + */ + public function getCacheTags() { + return []; + } + + /** + * {@inheritdoc} + */ + public function getCacheMaxAge() { + return Cache::PERMANENT; + } + }