Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Core/Config/Config.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/Config/Config.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,306 @@ +<?php + +namespace Drupal\Core\Config; + +use Drupal\Component\Utility\NestedArray; +use Drupal\Core\Cache\Cache; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; + +/** + * Defines the default configuration object. + * + * Encapsulates all capabilities needed for configuration handling for a + * specific configuration object, including support for runtime overrides. The + * overrides are handled on top of the stored configuration so they are not + * saved back to storage. + * + * @ingroup config_api + */ +class Config extends StorableConfigBase { + + /** + * An event dispatcher instance to use for configuration events. + * + * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface + */ + protected $eventDispatcher; + + /** + * The current runtime data. + * + * The configuration data from storage merged with module and settings + * overrides. + * + * @var array + */ + protected $overriddenData; + + /** + * The current module overrides. + * + * @var array + */ + protected $moduleOverrides; + + /** + * The current settings overrides. + * + * @var array + */ + protected $settingsOverrides; + + /** + * Constructs a configuration object. + * + * @param string $name + * The name of the configuration object being constructed. + * @param \Drupal\Core\Config\StorageInterface $storage + * A storage object to use for reading and writing the + * configuration data. + * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher + * An event dispatcher instance to use for configuration events. + * @param \Drupal\Core\Config\TypedConfigManagerInterface $typed_config + * The typed configuration manager service. + */ + public function __construct($name, StorageInterface $storage, EventDispatcherInterface $event_dispatcher, TypedConfigManagerInterface $typed_config) { + $this->name = $name; + $this->storage = $storage; + $this->eventDispatcher = $event_dispatcher; + $this->typedConfigManager = $typed_config; + } + + /** + * {@inheritdoc} + */ + public function initWithData(array $data) { + parent::initWithData($data); + $this->resetOverriddenData(); + return $this; + } + + /** + * {@inheritdoc} + */ + 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; + } + } + } + + /** + * {@inheritdoc} + */ + public function setData(array $data) { + parent::setData($data); + $this->resetOverriddenData(); + return $this; + } + + /** + * Sets settings.php overrides for this configuration object. + * + * The overridden data only applies to this configuration object. + * + * @param array $data + * The overridden values of the configuration data. + * + * @return \Drupal\Core\Config\Config + * The configuration object. + */ + public function setSettingsOverride(array $data) { + $this->settingsOverrides = $data; + $this->resetOverriddenData(); + return $this; + } + + /** + * Sets module overrides for this configuration object. + * + * @param array $data + * The overridden values of the configuration data. + * + * @return \Drupal\Core\Config\Config + * The configuration object. + */ + public function setModuleOverride(array $data) { + $this->moduleOverrides = $data; + $this->resetOverriddenData(); + return $this; + } + + /** + * Sets the current data for this configuration object. + * + * Configuration overrides operate at two distinct layers: modules and + * settings.php. Overrides in settings.php take precedence over values + * provided by modules. Precedence or different module overrides is + * determined by the priority of the config.factory.override tagged services. + * + * @return \Drupal\Core\Config\Config + * 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); + } + return $this; + } + + /** + * Resets the current data, so overrides are re-applied. + * + * This method should be called after the original data or the overridden data + * has been changed. + * + * @return \Drupal\Core\Config\Config + * The configuration object. + */ + protected function resetOverriddenData() { + unset($this->overriddenData); + return $this; + } + + /** + * {@inheritdoc} + */ + public function set($key, $value) { + parent::set($key, $value); + $this->resetOverriddenData(); + return $this; + } + + /** + * {@inheritdoc} + */ + public function clear($key) { + parent::clear($key); + $this->resetOverriddenData(); + return $this; + } + + /** + * {@inheritdoc} + */ + public function save($has_trusted_data = FALSE) { + // Validate the configuration object name before saving. + static::validateName($this->name); + + // If there is a schema for this configuration object, cast all values to + // conform to the schema. + if (!$has_trusted_data) { + if ($this->typedConfigManager->hasConfigSchema($this->name)) { + // Ensure that the schema wrapper has the latest data. + $this->schemaWrapper = NULL; + foreach ($this->data as $key => $value) { + $this->data[$key] = $this->castValue($key, $value); + } + } + else { + foreach ($this->data as $key => $value) { + $this->validateValue($key, $value); + } + } + } + + $this->storage->write($this->name, $this->data); + if (!$this->isNew) { + Cache::invalidateTags($this->getCacheTags()); + } + $this->isNew = FALSE; + $this->eventDispatcher->dispatch(ConfigEvents::SAVE, new ConfigCrudEvent($this)); + $this->originalData = $this->data; + // Potentially configuration schema could have changed the underlying data's + // types. + $this->resetOverriddenData(); + return $this; + } + + /** + * Deletes the configuration object. + * + * @return \Drupal\Core\Config\Config + * The configuration object. + */ + public function delete() { + $this->data = []; + $this->storage->delete($this->name); + Cache::invalidateTags($this->getCacheTags()); + $this->isNew = TRUE; + $this->resetOverriddenData(); + $this->eventDispatcher->dispatch(ConfigEvents::DELETE, new ConfigCrudEvent($this)); + $this->originalData = $this->data; + return $this; + } + + /** + * Gets the raw data without overrides. + * + * @return array + * The raw data. + */ + public function getRawData() { + return $this->data; + } + + /** + * Gets original data from this configuration object. + * + * Original data is the data as it is immediately after loading from + * configuration storage before any changes. If this is a new configuration + * object it will be an empty array. + * + * @see \Drupal\Core\Config\Config::get() + * + * @param string $key + * A string that maps to a key within the configuration data. + * @param bool $apply_overrides + * Apply any overrides to the original data. Defaults to TRUE. + * + * @return mixed + * The data that was requested. + */ + 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); + } + } + + if (empty($key)) { + return $original_data; + } + 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; + } + } + } + +}