use Consolidation\Config\Config;
use Consolidation\Config\ConfigInterface;
+use Consolidation\Config\Util\ArrayUtil;
+use Consolidation\Config\Util\ConfigInterpolatorInterface;
+use Consolidation\Config\Util\ConfigInterpolatorTrait;
/**
* Overlay different configuration objects that implement ConfigInterface
* individual configuration context. When using overlays, always call
* getDefault / setDefault on the ConfigOverlay object itself.
*/
-class ConfigOverlay implements ConfigInterface
+class ConfigOverlay implements ConfigInterface, ConfigInterpolatorInterface
{
+ use ConfigInterpolatorTrait;
protected $contexts = [];
const DEFAULT_CONTEXT = 'default';
* @inheritdoc
*/
public function get($key, $default = null)
+ {
+ if (is_array($default)) {
+ return $this->getUnion($key);
+ }
+ return $this->getSingle($key, $default);
+ }
+
+ public function getSingle($key, $default = null)
{
$context = $this->findContext($key);
if ($context) {
return $default;
}
+ public function getUnion($key)
+ {
+ $result = [];
+ foreach (array_reverse($this->contexts) as $name => $config) {
+ $item = (array) $config->get($key, []);
+ if ($item !== null) {
+ $result = array_merge($result, $item);
+ }
+ }
+ return $result;
+ }
+
/**
* @inheritdoc
*/
{
$export = [];
foreach ($this->contexts as $name => $config) {
- $export = array_merge_recursive($export, $config->export());
+ $exportToMerge = $config->export();
+ $export = \array_replace_recursive($export, $exportToMerge);
}
return $export;
}