8000 [DependencyInjection][Config] Use several placeholder unique prefixes… · symfony/symfony@d8ca8be · GitHub
[go: up one dir, main page]

Skip to content

Commit d8ca8be

Browse files
committed
[DependencyInjection][Config] Use several placeholder unique prefixes for dynamic placeholder values
1 parent 6c9a25c commit d8ca8be

File tree

3 files changed

+65
-10
lines changed

3 files changed

+65
-10
lines changed

src/Symfony/Component/Config/Definition/BaseNode.php

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ abstract class BaseNode implements NodeInterface
2626
{
2727
const DEFAULT_PATH_SEPARATOR = '.';
2828

29-
private static $placeholderUniquePrefix;
29+
private static < 10000 span class="pl-c1">$placeholderUniquePrefixes = [];
3030
private static $placeholders = [];
3131

3232
protected $name;
@@ -74,16 +74,16 @@ public static function setPlaceholder(string $placeholder, array $values): void
7474
}
7575

7676
/**
77-
* Sets a common prefix for dynamic placeholder values.
77+
* Adds a common prefix for dynamic placeholder values.
7878
*
7979
* Matching configuration values will be skipped from being processed and are returned as is, thus preserving the
8080
* placeholder. An exact match provided by {@see setPlaceholder()} might take precedence.
8181
*
8282
* @internal
8383
*/
84-
public static function setPlaceholderUniquePrefix(string $prefix): void
84+
public static function addPlaceholderUniquePrefix(string $prefix): void
8585
{
86-
self::$placeholderUniquePrefix = $prefix;
86+
self::$placeholderUniquePrefixes[] = $prefix;
8787
}
8888

8989
/**
@@ -93,7 +93,7 @@ public static function setPlaceholderUniquePrefix(string $prefix): void
9393
*/
9494
public static function resetPlaceholders(): void
9595
{
96-
self::$placeholderUniquePrefix = null;
96+
self::$placeholderUniquePrefixes = [];
9797
self::$placeholders = [];
9898
}
9999

@@ -513,8 +513,10 @@ private static function resolvePlaceholderValue($value)
513513
return self::$placeholders[$value];
514514
}
515515

516-
if (self::$placeholderUniquePrefix && 0 === strpos($value, self::$placeholderUniquePrefix)) {
517-
return [];
516+
foreach (self::$placeholderUniquePrefixes as $placeholderUniquePrefix) {
517+
if (0 === strpos($value, $placeholderUniquePrefix)) {
518+
return [];
519+
}
518520
}
519521
}
520522

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public function process(ContainerBuilder $container)
5656
// create a dedicated bag so that we can track env vars per-extension
5757
$resolvingBag = new MergeExtensionConfigurationParameterBag($resolvingBag);
5858
if ($configAvailable) {
59-
BaseNode::setPlaceholderUniquePrefix($resolvingBag->getEnvPlaceholderUniquePrefix());
59+
BaseNode::addPlaceholderUniquePrefix($resolvingBag->getEnvPlaceholderUniquePrefix());
6060
}
6161
}
6262
$config = $resolvingBag->resolveValue($config);
@@ -79,11 +79,11 @@ public function process(ContainerBuilder $container)
7979
$container->getParameterBag()->mergeEnvPlaceholders($resolvingBag);
8080
}
8181

82-
throw $e;
83-
} finally {
8482
if ($configAvailable) {
8583
BaseNode::resetPlaceholders();
8684
}
85+
86+
throw $e;
8787
}
8888

8989
if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {
@@ -95,6 +95,10 @@ public function process(ContainerBuilder $container)
9595
$container->getParameterBag()->add($parameters);
9696
}
9797

98+
if ($configAvailable) {
99+
BaseNode::resetPlaceholders();
100+
}
101+
98102
$container->addDefinitions($definitions);
99103
$container->addAliases($aliases);
100104
}

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,19 @@ public function testThrowingExtensionsGetMergedBag()
128128

129129
$this->assertSame(['FOO'], array_keys($container->getParameterBag()->getEnvPlaceholders()));
130130
}
131+
132+
public function testReuseEnvPlaceholderGeneratedByPreviousExtension()
133+
{
134+
$container = new ContainerBuilder();
135+
$container->registerExtension(new FooExtension());
136+
$container->registerExtension(new TestCccExtension());
137+
$container->prependExtensionConfig('foo', ['bool_node' => '%env(bool:MY_ENV_VAR)%']);
138+
$container->prependExtensionConfig('test_ccc', ['bool_node' => '%env(bool:MY_ENV_VAR)%']);
139+
140+
(new MergeExtensionConfigurationPass())->process($container);
141+
142+
$this->addToAssertionCount(1);
143+
}
131144
}
132145

133146
class FooConfiguration implements ConfigurationInterface
@@ -139,6 +152,7 @@ public function getConfigTreeBuilder(): TreeBuilder
139152
->children()
140153
->scalarNode('bar')->end()
141154
->scalarNode('baz')->end()
155+
->booleanNode('bool_node')->end()
142156
->end();
143157

144158
return $treeBuilder;
@@ -166,6 +180,8 @@ public function load(array $configs, ContainerBuilder $container)
166180
$container->getParameterBag()->get('env(BOZ)');
167181
$container->resolveEnvPlaceholders($config['baz']);
168182
}
183+
184+
$container->setParameter('foo.param', 'ccc');
169185
}
170186
}
171187

@@ -194,3 +210,36 @@ public function load(array $configs, ContainerBuilder $container)
194210
throw new \Exception();
195211
}
196212
}
213+
214+
final class TestCccConfiguration implements ConfigurationInterface
215+
{
216+
public function getConfigTreeBuilder(): TreeBuilder
217+
{
218+
$treeBuilder = new TreeBuilder('test_ccc');
219+
$treeBuilder->getRootNode()
220+
->children()
221+
->booleanNode('bool_node')->end()
222+
->end();
223+
224+
return $treeBuilder;
225+
}
226+
}
227+
228+
final class TestCccExtension extends Extension
229+
{
230+
public function getAlias(): string
231+
{
232+
return 'test_ccc';
233+
}
234+
235+
public function getConfiguration(array $config, ContainerBuilder $container): ?ConfigurationInterface
236+
{
237+
return new TestCccConfiguration();
238+
}
239+
240+
public function load(array $configs, ContainerBuilder $container)
241+
{
242+
$configuration = $this->getConfiguration($configs, $container);
243+
$this->processConfiguration($configuration, $configs);
244+
}
245+
}

0 commit comments

Comments
 (0)
0