diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php index e6b3295b3e..ae3869a02c 100644 --- a/core/lib/Drupal/Core/Config/Config.php +++ b/core/lib/Drupal/Core/Config/Config.php @@ -85,19 +85,7 @@ public function get($key = '') { if (!isset($this->overriddenData)) { $this->setOverriddenData(); } - if (empty($key)) { - return $this->overriddenData; - } - else { - $parts = explode('.', $key); - if (count($parts) == 1) { - return isset($this->overriddenData[$key]) ? $this->overriddenData[$key] : NULL; - } - else { - $value = NestedArray::getValue($this->overriddenData, $parts, $key_exists); - return $key_exists ? $value : NULL; - } - } + return self::extractKeyedData($this->overriddenData, $key); } /** @@ -142,17 +130,24 @@ public function setModuleOverride(array $data) { } /** - * Returns whether overrides apply to this configuration or not. + * Returns overrides that apply to this configuration. * * Simply comparing the the data from getOriginal() with and without overrides * does not help to detect overrides if the override happens to have the same * value as the original data. * - * @return bool - * True if overrides apply to this configuration, false otherwise. + * @param string $key + * A string that maps to a key within the configuration data. + * + * @return mixed + * The value of the override or NULL if not overwritten. */ - public function hasOverrides() { - return !empty($this->moduleOverrides) || !empty($this->settingsOverrides); + public function getOverrides($key = '') { + $overrides = $this->mergeOverridesWithData([]); + if (empty($overrides)) { + return NULL; + } + return self::extractKeyedData($overrides, $key); } /** @@ -167,13 +162,7 @@ public function hasOverrides() { * The configuration object. */ protected function setOverriddenData() { - $this->overriddenData = $this->data; - if (isset($this->moduleOverrides) && is_array($this->moduleOverrides)) { - $this->overriddenData = NestedArray::mergeDeepArray([$this->overriddenData, $this->moduleOverrides], TRUE); - } - if (isset($this->settingsOverrides) && is_array($this->settingsOverrides)) { - $this->overriddenData = NestedArray::mergeDeepArray([$this->overriddenData, $this->settingsOverrides], TRUE); - } + $this->overriddenData = $this->mergeOverridesWithData($this->data); return $this; } @@ -294,27 +283,29 @@ public function getOriginal($key = '', $apply_overrides = TRUE) { $original_data = $this->originalData; if ($apply_overrides) { // Apply overrides. - if (isset($this->moduleOverrides) && is_array($this->moduleOverrides)) { - $original_data = NestedArray::mergeDeepArray([$original_data, $this->moduleOverrides], TRUE); - } - if (isset($this->settingsOverrides) && is_array($this->settingsOverrides)) { - $original_data = NestedArray::mergeDeepArray([$original_data, $this->settingsOverrides], TRUE); - } + $original_data = $this->mergeOverridesWithData($original_data); } - if (empty($key)) { - return $original_data; + return self::extractKeyedData($original_data, $key); + } + + /** + * Merge module and settings overrides with the provided data. + * + * @param array $data + * The data to merge the overrides with. + * + * @return array + * The overwritten data, unchanged if no overrides apply. + */ + protected function mergeOverridesWithData(array $data) { + if (isset($this->moduleOverrides) && is_array($this->moduleOverrides)) { + $data = NestedArray::mergeDeepArray([$data, $this->moduleOverrides], TRUE); } - else { - $parts = explode('.', $key); - if (count($parts) == 1) { - return isset($original_data[$key]) ? $original_data[$key] : NULL; - } - else { - $value = NestedArray::getValue($original_data, $parts, $key_exists); - return $key_exists ? $value : NULL; - } + if (isset($this->settingsOverrides) && is_array($this->settingsOverrides)) { + $data = NestedArray::mergeDeepArray([$data, $this->settingsOverrides], TRUE); } + return $data; } } diff --git a/core/lib/Drupal/Core/Config/ConfigBase.php b/core/lib/Drupal/Core/Config/ConfigBase.php index 4f445ea21c..64f348a9a7 100644 --- a/core/lib/Drupal/Core/Config/ConfigBase.php +++ b/core/lib/Drupal/Core/Config/ConfigBase.php @@ -129,19 +129,7 @@ public static function validateName($name) { * The data that was requested. */ public function get($key = '') { - if (empty($key)) { - return $this->data; - } - else { - $parts = explode('.', $key); - if (count($parts) == 1) { - return isset($this->data[$key]) ? $this->data[$key] : NULL; - } - else { - $value = NestedArray::getValue($this->data, $parts, $key_exists); - return $key_exists ? $value : NULL; - } - } + return self::extractKeyedData($this->data, $key); } /** @@ -295,4 +283,33 @@ protected function castSafeStrings($data) { return $data; } + /** + * Extract the value of a sub key in the data. + * + * @param array $data + * The configuration data. + * @param string $key + * A string that maps to a key within the configuration data. + * + * @return mixed + * The data at the key or NULL if it is not set. + * + * @see \Drupal\Core\Config\ConfigBase::get + */ + protected static function extractKeyedData(array $data, $key) { + if (empty($key)) { + return $data; + } + else { + $parts = explode('.', $key); + if (count($parts) == 1) { + return isset($data[$key]) ? $data[$key] : NULL; + } + else { + $value = NestedArray::getValue($data, $parts, $key_exists); + return $key_exists ? $value : NULL; + } + } + } + } diff --git a/core/tests/Drupal/Tests/Core/Config/ConfigTest.php b/core/tests/Drupal/Tests/Core/Config/ConfigTest.php index 746e620917..8633e59fed 100644 --- a/core/tests/Drupal/Tests/Core/Config/ConfigTest.php +++ b/core/tests/Drupal/Tests/Core/Config/ConfigTest.php @@ -173,6 +173,7 @@ public function testSaveExisting($data) { * @covers ::setModuleOverride * @covers ::setSettingsOverride * @covers ::getOriginal + * @covers ::getOverrides * @dataProvider overrideDataProvider */ public function testOverrideData($data, $module_data, $setting_data) { @@ -184,39 +185,37 @@ public function testOverrideData($data, $module_data, $setting_data) { // Save so that the original data is stored. $this->config->save(); - - // Before overrides are set the configuration should indicate that. - $this->assertFalse($this->config->hasOverrides()); + $this->assertNull($this->config->getOverrides()); // Set module override data and check value before and after save. $this->config->setModuleOverride($module_data); $this->assertConfigDataEquals($module_data); - $this->assertTrue($this->config->hasOverrides()); + $this->assertEquals($module_data, $this->config->getOverrides()); $this->config->save(); $this->assertConfigDataEquals($module_data); - $this->assertTrue($this->config->hasOverrides()); + $this->assertEquals($module_data, $this->config->getOverrides()); // Reset the module overrides. $this->config->setModuleOverride([]); - $this->assertFalse($this->config->hasOverrides()); + $this->assertNull($this->config->getOverrides()); // Set setting override data and check value before and after save. $this->config->setSettingsOverride($setting_data); $this->assertConfigDataEquals($setting_data); - $this->assertTrue($this->config->hasOverrides()); + $this->assertEquals($setting_data, $this->config->getOverrides()); $this->config->save(); $this->assertConfigDataEquals($setting_data); - $this->assertTrue($this->config->hasOverrides()); + $this->assertEquals($setting_data, $this->config->getOverrides()); // Set module overrides again to ensure override order is correct. $this->config->setModuleOverride($module_data); // Setting data should be overriding module data. $this->assertConfigDataEquals($setting_data); - $this->assertTrue($this->config->hasOverrides()); + $this->assertEquals($setting_data, $this->config->getOverrides()); $this->config->save(); $this->assertConfigDataEquals($setting_data); - $this->assertTrue($this->config->hasOverrides()); + $this->assertEquals($setting_data, $this->config->getOverrides()); // Check original data has not changed. $this->assertOriginalConfigDataEquals($data, FALSE); @@ -228,16 +227,17 @@ public function testOverrideData($data, $module_data, $setting_data) { foreach ($setting_data as $key => $value) { $config_value = $this->config->getOriginal($key); $this->assertEquals($value, $config_value); + $this->assertEquals($value, $this->config->getOverrides($key)); } // Check that the overrides can be completely reset. $this->config->setModuleOverride([]); $this->config->setSettingsOverride([]); $this->assertConfigDataEquals($data); - $this->assertFalse($this->config->hasOverrides()); + $this->assertNull($this->config->getOverrides()); $this->config->save(); $this->assertConfigDataEquals($data); - $this->assertFalse($this->config->hasOverrides()); + $this->assertNull($this->config->getOverrides()); } /**