8000 [DI] Fix tracking of env vars in exceptions · symfony/symfony@a662881 · GitHub
[go: up one dir, main page]

Skip to content

Commit a662881

Browse files
[DI] Fix tracking of env vars in exceptions
1 parent ca5b15a commit a662881

File tree

2 files changed

+53
-10
lines changed

2 files changed

+53
-10
lines changed

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,26 @@ public function process(ContainerBuilder $container)
5252
}
5353
$config = $resolvingBag->resolveValue($config);
5454

55-
$tmpContainer = new ContainerBuilder($resolvingBag);
56-
$tmpContainer->setResourceTracking($container->isTrackingResources());
57-
$tmpContainer->addObjectResource($extension);
58-
if ($extension instanceof ConfigurationExtensionInterface && null !== $configuration = $extension->getConfiguration($config, $tmpContainer)) {
59-
$tmpContainer->addObjectResource($configuration);
60-
}
55+
try {
56+
$tmpContainer = new ContainerBuilder($resolvingBag);
57+
$tmpContainer->setResourceTracking($container->isTrackingResources());
58+
$tmpContainer->addObjectResource($extension);
59+
if ($extension instanceof ConfigurationExtensionInterface && null !== $configuration = $extension->getConfiguration($config, $tmpContainer)) {
60+
$tmpContainer->addObjectResource($configuration);
61+
}
6162

62-
foreach ($exprLangProviders as $provider) {
63-
$tmpContainer->addExpressionLanguageProvider($provider);
64-
}
63+
foreach ($exprLangProviders as $provider) {
64+
$tmpContainer->addExpressionLanguageProvider($provider);
65+
}
6566

66-
$extension->load($config, $tmpContainer);
67+
$extension->load($config, $tmpContainer);
68+
} catch (\Exception $e) {
69+
if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {
70+
$container->getParameterBag()->mergeEnvPlaceholders($resolvingBag);
71+
}
72+
73+
throw $e;
74+
}
6775

6876
if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {
6977
// don't keep track of env vars that are *overridden* when configs are merged

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,22 @@ public function testOverriddenEnvsAreMerged()
8484
$this->assertSame(array('BAZ', 'FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
8585
$this->assertSame(array('BAZ' => 1, 'FOO' => 0), $container->getEnvCounters());
8686
}
87+
88+
public function testThrowingExtensionsGetMergedBag()
89+
{
90+
$container = new ContainerBuilder();
91+
$container->registerExtension(new ThrowingExtension());
92+
$container->prependExtensionConfig('throwing', array('bar' => '%env(FOO)%'));
93+
94+
try {
95+
$pass = new MergeExtensionConfigurationPass();
96+
$pass->process($container);
97+
$this->fail('An exception should have been thrown.');
98+
} catch (\Exception $e) {
99+
}
100+
101+
$this->assertSame(array('FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
102+
}
87103
}
88104

89105
class FooConfiguration implements ConfigurationInterface
@@ -125,3 +141,22 @@ public function load(array $configs, ContainerBuilder $container)
125141
}
126142
}
127143
}
144+
145+
146+
class ThrowingExtension extends Extension
147+
{
148+
public function getAlias()
149+
{
150+
return 'throwing';
151+
}
152+
153+
public function getConfiguration(array $config, ContainerBuilder $container)
154+
{
155+
return new FooConfiguration();
156+
}
157+
158+
public function load(array $configs, ContainerBuilder $container)
159+
{
160+
throw new \Exception();
161+
}
162+
}

0 commit comments

Comments
 (0)
0