diff --git a/core/includes/config.inc b/core/includes/config.inc index b29c824..700a71f 100644 --- a/core/includes/config.inc +++ b/core/includes/config.inc @@ -76,10 +76,7 @@ function config_get_storage_names_with_prefix($prefix = '') { * A configuration object. */ function config($name) { - // @todo config needs to be a factory per name. Definition seems to support - // this somehow, but grepping the net didn't yield usable results. - // This clone is a utterly ugly hack and stop-gap fix only. - return clone drupal_container()->get('config')->setName($name)->load(); + return drupal_container()->get('config.factory')->get($name)->load(); } /** @@ -220,8 +217,18 @@ function config_import_invoke_sync_hooks(array $config_changes) { $handled_by_module = FALSE; if (module_hook($module, 'config_import')) { $old_config = new ConfigObject($storage_manager); - $old_config->setName($name)->load(); - $data = $source_storage->read($name); + $old_config->setName($name); + try { + $old_config->load(); + } + catch (ConfigException $e) { + } + try { + $data = $source_storage->read($name); + } + catch (ConfigException $e) { + $data = array(); + } $new_config = new ConfigObject($storage_manager); $new_config->setName($name)->setData($data); $handled_by_module = module_invoke($module, 'config_import', $op, $name, $new_config, $old_config); diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php new file mode 100644 index 0000000..91135e1 --- /dev/null +++ b/core/lib/Drupal/Core/Config/ConfigFactory.php @@ -0,0 +1,47 @@ +container = $container; + } + + /** + * Returns a configuration object for a given name. + * + * @param string $name + * The name of the configuration object to construct. + * + * @return Drupal\Core\Config\ConfigObject + * A configuration object with the given $name. + */ + public function get($name) { + $class = $this->container->getParameter('config.object'); + $config = new $class($this->container->get('config.manager')); + return $config->setName($name); + } +} diff --git a/core/lib/Drupal/Core/Config/FileStorage.php b/core/lib/Drupal/Core/Config/FileStorage.php index 7151e1b..bafd099 100644 --- a/core/lib/Drupal/Core/Config/FileStorage.php +++ b/core/lib/Drupal/Core/Config/FileStorage.php @@ -78,6 +78,7 @@ class FileStorage implements StorageInterface { * @throws StorageException */ public function read($name) { + // @todo DatabaseStorage does not throw an exception if $name does not exist. if (!$this->exists($name)) { throw new StorageException("Configuration file '$name' does not exist."); } diff --git a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php index 34407c2..2099e40 100644 --- a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php +++ b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php @@ -45,9 +45,12 @@ class ContainerBuilder extends BaseContainerBuilder { ->addArgument('%config.storage.info%'); // Register configuration system. - // @todo config needs to be a factory per name. Definition seems to support - // this somehow, but grepping the net didn't yield usable results. + $this->setParameter('config.factory', 'Drupal\Core\Config\ConfigFactory'); $this->setParameter('config.object', 'Drupal\Core\Config\ConfigObject'); + $this->register('config.factory', '%config.factory%') + ->addArgument(new Reference('service_container')) + ; + // @todo Obsolete? $this->register('config', '%config.object%') ->addArgument(new Reference('config.manager')); } diff --git a/core/modules/config/config_test/lib/Drupal/config_test/ConfigTest.php b/core/modules/config/config_test/lib/Drupal/config_test/ConfigTest.php index dbfdc67..2bb25c7 100644 --- a/core/modules/config/config_test/lib/Drupal/config_test/ConfigTest.php +++ b/core/modules/config/config_test/lib/Drupal/config_test/ConfigTest.php @@ -148,9 +148,6 @@ class ConfigTest { public function save() { // Provide the original configuration in $config->original, if any. if (isset($this->originalId)) { -// // @todo DI currently overloads the config object. Back it up. -// $new_config = clone $this->config; - $original_config = config($this->getConfigPrefix() . '.' . $this->originalId); $this->setOriginal(new $this($original_config)); @@ -163,9 +160,6 @@ class ConfigTest { $original_config->delete(); $original_config->setData($original_data); } - -// // @todo See DI @todo above. -// $this->config = $new_config; } // Save the new configuration. diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigCRUDTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigCRUDTest.php index 1b2cb0e..881cf8f 100644 --- a/core/modules/config/lib/Drupal/config/Tests/ConfigCRUDTest.php +++ b/core/modules/config/lib/Drupal/config/Tests/ConfigCRUDTest.php @@ -50,10 +50,6 @@ class ConfigCRUDTest extends WebTestBase { $new_config = config($name); $this->assertIdentical($new_config->get(), $config->get()); - // Verify config() returned the existing config instance. - // @todo Requires DI fix. -// $this->assertIdentical($new_config, $config); - // Delete the configuration object. $config->delete(); @@ -68,10 +64,6 @@ class ConfigCRUDTest extends WebTestBase { $new_config = config($name); $this->assertIdentical($new_config->get(), $config->get()); - // Verify config() returned the existing config instance. - // @todo Requires DI fix. -// $this->assertIdentical($new_config, $config); - // Re-create the configuration object. $config->set('value', 're-created'); $config->save(); @@ -83,10 +75,6 @@ class ConfigCRUDTest extends WebTestBase { // Verify a call to config() immediately returns the updated value. $new_config = config($name); $this->assertIdentical($new_config->get(), $config->get()); - - // Verify config() returned the existing config instance. - // @todo Requires DI fix. -// $this->assertIdentical($new_config, $config); } /** diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigImportTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigImportTest.php index 924e662..5e1bbfa 100644 --- a/core/modules/config/lib/Drupal/config/Tests/ConfigImportTest.php +++ b/core/modules/config/lib/Drupal/config/Tests/ConfigImportTest.php @@ -7,6 +7,7 @@ namespace Drupal\config\Tests; +use Drupal\Core\Config\DatabaseStorage; use Drupal\Core\Config\FileStorage; use Drupal\simpletest\WebTestBase; @@ -51,6 +52,10 @@ class ConfigImportTest extends WebTestBase { config_import(); // Verify the values have disappeared. + $database_storage = new DatabaseStorage(); + $this->assertIdentical($database_storage->read($name), array()); + $this->assertIdentical($database_storage->read($dynamic_name), array()); + $config = config($name); $this->assertIdentical($config->get('foo'), NULL); $config = config($dynamic_name);