Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b1837b1

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

File tree

3 files changed

+75
-11
lines changed

3 files changed

+75
-11
lines changed

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

Lines changed: 18 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 $placeholderUniquePrefixes = [];
3030
private static $placeholders = [];
3131

3232
protected $name;
@@ -74,16 +74,26 @@ 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;
87+
}
88+
89+
/**
90+
* Resets all current placeholder unique prefixes available.
91+
*
92+
* @internal
93+
*/
94+
public static function resetPlaceholderUniquePrefixes(): void
95+
{
96+
self::$placeholderUniquePrefixes = [];
8797
}
8898

8999
/**
@@ -93,7 +103,6 @@ public static function setPlaceholderUniquePrefix(string $prefix): void
93103
*/
94104
public static function resetPlaceholders(): void
95105
{
96-
self::$placeholderUniquePrefix = null;
97106
self::$placeholders = [];
98107
}
99108

@@ -513,8 +522,10 @@ private static function resolvePlaceholderValue($value)
513522
return self::$placeholders[$value];
514523
}
515524

516-
if (self::$placeholderUniquePrefix && 0 === strpos($value, self::$placeholderUniquePrefix)) {
517-
return [];
525+
foreach (self::$placeholderUniquePrefixes as $placeholderUniquePrefix) {
526+
if (0 === strpos($value, $placeholderUniquePrefix)) {
527+
return [];
528+
}
518529
}
519530
}
520531

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

Lines changed: 8 additions & 4 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) {
85-
BaseNode::resetPlaceholders();
83+
BaseNode::resetPlaceholderUniquePrefixes();
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::resetPlaceholderUniquePrefixes();
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)