8000 [DI] Fix merging of env vars in configs · symfony/symfony@822cb89 · GitHub
[go: up one dir, main page]

Skip to content

Commit 822cb89

Browse files
[DI] Fix merging of env vars in configs
1 parent d32c706 commit 822cb89

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ public function process(ContainerBuilder $container)
4343
// this extension was not called
4444
continue;
4545
}
46+
for ($i = count($config) - 1; $i > 0; --$i) {
47+
$config[$i - 1] = $this->mergeConfig($config[$i - 1], $config[$i]);
48+
}
4649
$config = $container->getParameterBag()->resolveValue($config);
4750

4851
$tmpContainer = new ContainerBuilder($container->getParameterBag());
@@ -65,4 +68,20 @@ public function process(ContainerBuilder $container)
6568
$container->addDefinitions($definitions);
6669
$container->addAliases($aliases);
6770
}
71+
72+
private function mergeConfig(array $leftSide, array $rightSide)
73+
{
74+
foreach ($leftSide as $k => $v) {
75+
if (!array_key_exists($k, $rightSide)) {
76+
continue;
77+
}
78+
if (is_array($v) && is_array($rightSide[$k])) {
79+
$leftSide[$k] = $this->mergeConfig($v, $rightSide[$k]);
80+
} else {
81+
$leftSide[$k] = $rightSide[$k];
82+
}
83+
}
84+
85+
return $leftSide;
86+
}
6887
}

src/Symfony/Component/DependencyInjection/Tests/Compiler/MergeExtensionConfigurationPassTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,24 @@ public function testExtensionConfigurationIsTrackedByDefault()
7272

7373
$this->assertContains(new FileResource(__FILE__), $container->getResources(), '', false, false);
7474
}
75+
76+
public function testOverriddenEnvsAreMerged()
77+
{
78+
$extension = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\Extension\\Extension')->getMock();
79+
$extension->expects($this->any())
80+
->method('getAlias')
81+
->will($this->returnValue('foo'));
82+
83+
$container = new ContainerBuilder();
84+
$container->registerExtension($extension);
85+
$container->prependExtensionConfig('foo', array('bar' => '%env(FOO)%'));
86+
$container->prependExtensionConfig('foo', array('bar' => '%env(BAR)%'));
87+
88+
$pass = new MergeExtensionConfigurationPass();
89+
$pass->process($container);
90+
91+
$this->assertSame(array('FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
92+
}
7593
}
7694

7795
class FooConfiguration implements ConfigurationInterface

0 commit comments

Comments
 (0)
0