diff --git a/src/Symfony/Component/Config/Definition/BaseNode.php b/src/Symfony/Component/Config/Definition/BaseNode.php index 16dfccb54c1d2..40ed28a37365a 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 7ba19515b82d1..8a862d88cc388 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 0638f90417df5..281bac297107b 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()