From bbb9e954b773653f4028db0cc304e7857855b443 Mon Sep 17 00:00:00 2001 From: Roland Franssen Date: Wed, 21 Nov 2018 12:27:18 +0100 Subject: [PATCH] [DI] Preserve placeholder exception for dynamic arrays --- .../Component/Config/Definition/BaseNode.php | 2 +- .../Config/Definition/Builder/ExprBuilder.php | 2 +- .../ValidateEnvPlaceholdersPassTest.php | 25 +++++++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Config/Definition/BaseNode.php b/src/Symfony/Component/Config/Definition/BaseNode.php index 16dfccb54c1d..40ed28a37365 100644 --- a/src/Symfony/Component/Config/Definition/BaseNode.php +++ b/src/Symfony/Component/Config/Definition/BaseNode.php @@ -332,7 +332,7 @@ final public function normalize($value) // run custom normalization closures foreach ($this->normalizationClosures as $closure) { - $value = $closure($value); + $value = $closure($value, $value !== self::resolvePlaceholderValue($value)); } // resolve placeholder value diff --git a/src/Symfony/Component/Config/Definition/Builder/ExprBuilder.php b/src/Symfony/Component/Config/Definition/Builder/ExprBuilder.php index 7ba19515b82d..8a862d88cc38 100644 --- a/src/Symfony/Component/Config/Definition/Builder/ExprBuilder.php +++ b/src/Symfony/Component/Config/Definition/Builder/ExprBuilder.php @@ -238,7 +238,7 @@ public static function buildExpressions(array $expressions) $if = $expr->ifPart; $then = $expr->thenPart; $expressions[$k] = function ($v) use ($if, $then) { - return $if($v) ? $then($v) : $v; + return $if(...\func_get_args()) ? $then(...\func_get_args()) : $v; }; } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ValidateEnvPlaceholdersPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ValidateEnvPlaceholdersPassTest.php index 0638f90417df..281bac297107 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ValidateEnvPlaceholdersPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ValidateEnvPlaceholdersPassTest.php @@ -265,6 +265,21 @@ public function testDiscardedEnvInConfig(): void $this->assertSame('1', $container->getParameter('boolish')); } + /** + * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidTypeException + * @expectedExceptionMessage A dynamic value is not compatible with a "Symfony\Component\Config\Definition\PrototypedArrayNode" node type at path "env_extension.nodes". + */ + public function testNormalizedPlaceholderArray() + { + $container = new ContainerBuilder(); + $container->registerExtension($ext = new EnvExtension(new ConfigurationWithArrayNodeRequiringOneElement())); + $container->loadFromExtension('env_extension', array( + 'nodes' => '%env(SOME)%', + )); + + $this->doProcess($container); + } + private function doProcess(ContainerBuilder $container): void { (new MergeExtensionConfigurationPass())->process($container); @@ -340,10 +355,16 @@ class ConfigurationWithArrayNodeRequiringOneElement implements ConfigurationInte { public function getConfigTreeBuilder() { - $treeBuilder = new TreeBuilder(); - $treeBuilder->root('env_extension') + $treeBuilder = new TreeBuilder('env_extension'); + $treeBuilder->getRootNode() ->children() ->arrayNode('nodes') + ->beforeNormalization() + ->ifString() + ->then(function ($v, bool $isEnv) { + return $isEnv ? $v : array($v); + }) + ->end() ->isRequired() ->requiresAtLeastOneElement() ->scalarPrototype()->end()