Mercurial > hg > isophonics-drupal-site
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\Core\Config; | |
4 | |
5 use Drupal\Component\Utility\NestedArray; | |
6 use Drupal\Core\Cache\Cache; | |
7 use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
8 | |
9 /** | |
10 * Defines the default configuration object. | |
11 * | |
12 * Encapsulates all capabilities needed for configuration handling for a | |
13 * specific configuration object, including support for runtime overrides. The | |
14 * overrides are handled on top of the stored configuration so they are not | |
15 * saved back to storage. | |
16 * | |
17 * @ingroup config_api | |
18 */ | |
19 class Config extends StorableConfigBase { | |
20 | |
21 /** | |
22 * An event dispatcher instance to use for configuration events. | |
23 * | |
24 * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface | |
25 */ | |
26 protected $eventDispatcher; | |
27 | |
28 /** | |
29 * The current runtime data. | |
30 * | |
31 * The configuration data from storage merged with module and settings | |
32 * overrides. | |
33 * | |
34 * @var array | |
35 */ | |
36 protected $overriddenData; | |
37 | |
38 /** | |
39 * The current module overrides. | |
40 * | |
41 * @var array | |
42 */ | |
43 protected $moduleOverrides; | |
44 | |
45 /** | |
46 * The current settings overrides. | |
47 * | |
48 * @var array | |
49 */ | |
50 protected $settingsOverrides; | |
51 | |
52 /** | |
53 * Constructs a configuration object. | |
54 * | |
55 * @param string $name | |
56 * The name of the configuration object being constructed. | |
57 * @param \Drupal\Core\Config\StorageInterface $storage | |
58 * A storage object to use for reading and writing the | |
59 * configuration data. | |
60 * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher | |
61 * An event dispatcher instance to use for configuration events. | |
62 * @param \Drupal\Core\Config\TypedConfigManagerInterface $typed_config | |
63 * The typed configuration manager service. | |
64 */ | |
65 public function __construct($name, StorageInterface $storage, EventDispatcherInterface $event_dispatcher, TypedConfigManagerInterface $typed_config) { | |
66 $this->name = $name; | |
67 $this->storage = $storage; | |
68 $this->eventDispatcher = $event_dispatcher; | |
69 $this->typedConfigManager = $typed_config; | |
70 } | |
71 | |
72 /** | |
73 * {@inheritdoc} | |
74 */ | |
75 public function initWithData(array $data) { | |
76 parent::initWithData($data); | |
77 $this->resetOverriddenData(); | |
78 return $this; | |
79 } | |
80 | |
81 /** | |
82 * {@inheritdoc} | |
83 */ | |
84 public function get($key = '') { | |
85 if (!isset($this->overriddenData)) { | |
86 $this->setOverriddenData(); | |
87 } | |
88 if (empty($key)) { | |
89 return $this->overriddenData; | |
90 } | |
91 else { | |
92 $parts = explode('.', $key); | |
93 if (count($parts) == 1) { | |
94 return isset($this->overriddenData[$key]) ? $this->overriddenData[$key] : NULL; | |
95 } | |
96 else { | |
97 $value = NestedArray::getValue($this->overriddenData, $parts, $key_exists); | |
98 return $key_exists ? $value : NULL; | |
99 } | |
100 } | |
101 } | |
102 | |
103 /** | |
104 * {@inheritdoc} | |
105 */ | |
106 public function setData(array $data) { | |
107 parent::setData($data); | |
108 $this->resetOverriddenData(); | |
109 return $this; | |
110 } | |
111 | |
112 /** | |
113 * Sets settings.php overrides for this configuration object. | |
114 * | |
115 * The overridden data only applies to this configuration object. | |
116 * | |
117 * @param array $data | |
118 * The overridden values of the configuration data. | |
119 * | |
120 * @return \Drupal\Core\Config\Config | |
121 * The configuration object. | |
122 */ | |
123 public function setSettingsOverride(array $data) { | |
124 $this->settingsOverrides = $data; | |
125 $this->resetOverriddenData(); | |
126 return $this; | |
127 } | |
128 | |
129 /** | |
130 * Sets module overrides for this configuration object. | |
131 * | |
132 * @param array $data | |
133 * The overridden values of the configuration data. | |
134 * | |
135 * @return \Drupal\Core\Config\Config | |
136 * The configuration object. | |
137 */ | |
138 public function setModuleOverride(array $data) { | |
139 $this->moduleOverrides = $data; | |
140 $this->resetOverriddenData(); | |
141 return $this; | |
142 } | |
143 | |
144 /** | |
145 * Sets the current data for this configuration object. | |
146 * | |
147 * Configuration overrides operate at two distinct layers: modules and | |
148 * settings.php. Overrides in settings.php take precedence over values | |
149 * provided by modules. Precedence or different module overrides is | |
150 * determined by the priority of the config.factory.override tagged services. | |
151 * | |
152 * @return \Drupal\Core\Config\Config | |
153 * The configuration object. | |
154 */ | |
155 protected function setOverriddenData() { | |
156 $this->overriddenData = $this->data; | |
157 if (isset($this->moduleOverrides) && is_array($this->moduleOverrides)) { | |
158 $this->overriddenData = NestedArray::mergeDeepArray([$this->overriddenData, $this->moduleOverrides], TRUE); | |
159 } | |
160 if (isset($this->settingsOverrides) && is_array($this->settingsOverrides)) { | |
161 $this->overriddenData = NestedArray::mergeDeepArray([$this->overriddenData, $this->settingsOverrides], TRUE); | |
162 } | |
163 return $this; | |
164 } | |
165 | |
166 /** | |
167 * Resets the current data, so overrides are re-applied. | |
168 * | |
169 * This method should be called after the original data or the overridden data | |
170 * has been changed. | |
171 * | |
172 * @return \Drupal\Core\Config\Config | |
173 * The configuration object. | |
174 */ | |
175 protected function resetOverriddenData() { | |
176 unset($this->overriddenData); | |
177 return $this; | |
178 } | |
179 | |
180 /** | |
181 * {@inheritdoc} | |
182 */ | |
183 public function set($key, $value) { | |
184 parent::set($key, $value); | |
185 $this->resetOverriddenData(); | |
186 return $this; | |
187 } | |
188 | |
189 /** | |
190 * {@inheritdoc} | |
191 */ | |
192 public function clear($key) { | |
193 parent::clear($key); | |
194 $this->resetOverriddenData(); | |
195 return $this; | |
196 } | |
197 | |
198 /** | |
199 * {@inheritdoc} | |
200 */ | |
201 public function save($has_trusted_data = FALSE) { | |
202 // Validate the configuration object name before saving. | |
203 static::validateName($this->name); | |
204 | |
205 // If there is a schema for this configuration object, cast all values to | |
206 // conform to the schema. | |
207 if (!$has_trusted_data) { | |
208 if ($this->typedConfigManager->hasConfigSchema($this->name)) { | |
209 // Ensure that the schema wrapper has the latest data. | |
210 $this->schemaWrapper = NULL; | |
211 foreach ($this->data as $key => $value) { | |
212 $this->data[$key] = $this->castValue($key, $value); | |
213 } | |
214 } | |
215 else { | |
216 foreach ($this->data as $key => $value) { | |
217 $this->validateValue($key, $value); | |
218 } | |
219 } | |
220 } | |
221 | |
222 $this->storage->write($this->name, $this->data); | |
223 if (!$this->isNew) { | |
224 Cache::invalidateTags($this->getCacheTags()); | |
225 } | |
226 $this->isNew = FALSE; | |
227 $this->eventDispatcher->dispatch(ConfigEvents::SAVE, new ConfigCrudEvent($this)); | |
228 $this->originalData = $this->data; | |
229 // Potentially configuration schema could have changed the underlying data's | |
230 // types. | |
231 $this->resetOverriddenData(); | |
232 return $this; | |
233 } | |
234 | |
235 /** | |
236 * Deletes the configuration object. | |
237 * | |
238 * @return \Drupal\Core\Config\Config | |
239 * The configuration object. | |
240 */ | |
241 public function delete() { | |
242 $this->data = []; | |
243 $this->storage->delete($this->name); | |
244 Cache::invalidateTags($this->getCacheTags()); | |
245 $this->isNew = TRUE; | |
246 $this->resetOverriddenData(); | |
247 $this->eventDispatcher->dispatch(ConfigEvents::DELETE, new ConfigCrudEvent($this)); | |
248 $this->originalData = $this->data; | |
249 return $this; | |
250 } | |
251 | |
252 /** | |
253 * Gets the raw data without overrides. | |
254 * | |
255 * @return array | |
256 * The raw data. | |
257 */ | |
258 public function getRawData() { | |
259 return $this->data; | |
260 } | |
261 | |
262 /** | |
263 * Gets original data from this configuration object. | |
264 * | |
265 * Original data is the data as it is immediately after loading from | |
266 * configuration storage before any changes. If this is a new configuration | |
267 * object it will be an empty array. | |
268 * | |
269 * @see \Drupal\Core\Config\Config::get() | |
270 * | |
271 * @param string $key | |
272 * A string that maps to a key within the configuration data. | |
273 * @param bool $apply_overrides | |
274 * Apply any overrides to the original data. Defaults to TRUE. | |
275 * | |
276 * @return mixed | |
277 * The data that was requested. | |
278 */ | |
279 public function getOriginal($key = '', $apply_overrides = TRUE) { | |
280 $original_data = $this->originalData; | |
281 if ($apply_overrides) { | |
282 // Apply overrides. | |
283 if (isset($this->moduleOverrides) && is_array($this->moduleOverrides)) { | |
284 $original_data = NestedArray::mergeDeepArray([$original_data, $this->moduleOverrides], TRUE); | |
285 } | |
286 if (isset($this->settingsOverrides) && is_array($this->settingsOverrides)) { | |
287 $original_data = NestedArray::mergeDeepArray([$original_data, $this->settingsOverrides], TRUE); | |
288 } | |
289 } | |
290 | |
291 if (empty($key)) { | |
292 return $original_data; | |
293 } | |
294 else { | |
295 $parts = explode('.', $key); | |
296 if (count($parts) == 1) { | |
297 return isset($original_data[$key]) ? $original_data[$key] : NULL; | |
298 } | |
299 else { | |
300 $value = NestedArray::getValue($original_data, $parts, $key_exists); | |
301 return $key_exists ? $value : NULL; | |
302 } | |
303 } | |
304 } | |
305 | |
306 } |