Skip to content

Commit b230525

Browse files
committed
Merge branch '3.3' into 3.4
* 3.3: (27 commits) Always require symfony/polyfill-apcu to provide APCuIterator everywhere bumped Symfony version to 3.3.9 updated VERSION for 3.3.8 updated CHANGELOG for 3.3.8 [DI] Fix tracking env var placeholders nested in object graphs bumped Symfony version to 3.3.8 updated VERSION for 3.3.7 updated CHANGELOG for 3.3.7 [DI] Fix tracking env vars when merging configs (bis) removed obsolete comment install PHPUnit 6 on PHP 7.2 [Cache] Use zend.detect_unicode instead of zend.multibyte Fix case sensitive typo in use class name [VarDumper] Enhance docblock to tell about AbstractDumper::dumpLine(-1) [Debug] Remove false-positive check in DebugClassLoader [Validator] Fix use of GroupSequenceProvider in child classes Change number PHPDoc type to int|float [Cache] Workaround zend.detect_unicode + zend.multibyte [VarDumper] Strengthen dumped JS [VarDumper] Strengthen dumped JS ...
2 parents d745a2a + 2ac6589 commit b230525

File tree

3 files changed

+42
-55
lines changed

3 files changed

+42
-55
lines changed

Compiler/MergeExtensionConfigurationPass.php

Lines changed: 27 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
1616
use Symfony\Component\DependencyInjection\Extension\Extension;
1717
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
18-
use Symfony\Component\DependencyInjection\Parameterbag\EnvPlaceholderParameterBag;
18+
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
1919

2020
/**
2121
* Merges extension configs into the container builder.
@@ -45,12 +45,14 @@ public function process(ContainerBuilder $container)
4545
// this extension was not called
4646
continue;
4747
}
48-
// EnvPlaceholderParameterBag tracks env vars when calling resolveValue().
49-
// Clone so that tracking is done in a dedicated bag.
50-
$resolvingBag = clone $container->getParameterBag();
48+
$resolvingBag = $container->getParameterBag();
49+
if ($resolvingBag instanceof EnvPlaceholderParameterBag && $extension instanceof Extension) {
50+
// create a dedicated bag so that we can track env vars per-extension
51+
$resolvingBag = new MergeExtensionConfigurationParameterBag($resolvingBag);
52+
}
5153
$config = $resolvingBag->resolveValue($config);
5254

53-
$tmpContainer = new ContainerBuilder($container->getParameterBag());
55+
$tmpContainer = new ContainerBuilder($resolvingBag);
5456
$tmpContainer->setResourceTracking($container->isTrackingResources());
5557
$tmpContainer->addObjectResource($extension);
5658
if ($extension instanceof ConfigurationExtensionInterface && null !== $configuration = $extension->getConfiguration($config, $tmpContainer)) {
@@ -63,13 +65,9 @@ public function process(ContainerBuilder $container)
6365

6466
$extension->load($config, $tmpContainer);
6567

66-
if ($resolvingBag instanceof EnvPlaceholderParameterBag) {
67-
// $resolvingBag keeps track of env vars encoutered *before* merging configs
68-
if ($extension instanceof Extension) {
69-
// but we don't want to keep track of env vars that are *overridden* when configs are merged
70-
$resolvingBag = new MergeExtensionConfigurationParameterBag($extension, $resolvingBag);
71-
}
72-
$container->getParameterBag()->mergeEnvPlaceholders($resolvingBag);
68+
if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {
69+
// don't keep track of env vars that are *overridden* when configs are merged
70+
$resolvingBag->freezeAfterProcessing($extension);
7371
}
7472

7573
$container->merge($tmpContainer);
@@ -86,60 +84,36 @@ public function process(ContainerBuilder $container)
8684
*/
8785
class MergeExtensionConfigurationParameterBag extends EnvPlaceholderParameterBag
8886
{
89-
private $beforeProcessingEnvPlaceholders;
87+
private $processedEnvPlaceholders;
9088

91-
public function __construct(Extension $extension, parent $resolvingBag)
89+
public function __construct(parent $parameterBag)
9290
{
93-
$this->beforeProcessingEnvPlaceholders = $resolvingBag->getEnvPlaceholders();
94-
$config = $this->resolveEnvPlaceholders($extension->getProcessedConfigs());
95-
parent::__construct($this->resolveValue($config));
91+
parent::__construct($parameterBag->all());
92+
$this->mergeEnvPlaceholders($parameterBag);
9693
}
9794

98-
/**
99-
* {@inheritdoc}
100-
*/
101-
public function get($name)
95+
public function freezeAfterProcessing(Extension $extension)
10296
{
103-
return $this->has($name) || (0 === strpos($name, 'env(') && ')' === substr($name, -1) && 'env()' !== $name) ? parent::get($name) : '';
104-
}
97+
$this->processedEnvPlaceholders = array();
10598

106-
/**
107-
* {@inheritdoc}
108-
*/
109-
public function getEnvPlaceholders()
110-
{
111-
// contains the list of env vars that are still used after configs have been merged
112-
$envPlaceholders = parent::getEnvPlaceholders();
99+
// serialize config to catch env vars nested in object graphs
100+
$config = serialize($extension->getProcessedConfigs());
113101

114-
foreach ($envPlaceholders as $env => $placeholders) {
115-
if (isset($this->beforeProcessingEnvPlaceholders[$env])) {
116-
// for still-used env vars, keep track of their before-processing placeholders
117-
$envPlaceholders[$env] += $this->beforeProcessingEnvPlaceholders[$env];
102+
foreach (parent::getEnvPlaceholders() as $env => $placeholders) {
103+
foreach ($placeholders as $placeholder) {
104+
if (false !== stripos($config, $placeholder)) {
105+
$this->processedEnvPlaceholders[$env] = $placeholders;
106+
break;
107+
}
118108
}
119109
}
120-
121-
return $envPlaceholders;
122110
}
123111

124112
/**
125-
* Replaces-back env placeholders to their original "%env(FOO)%" version.
113+
* {@inheritdoc}
126114
*/
127-
private function resolveEnvPlaceholders($value)
115+
public function getEnvPlaceholders()
128116
{
129-
if (is_array($value)) {
130-
foreach ($value as $k => $v) {
131-
$value[$this->resolveEnvPlaceholders($k)] = $this->resolveEnvPlaceholders($v);
132-
}
133-
} elseif (is_string($value)) {
134-
foreach ($this->beforeProcessingEnvPlaceholders as $env => $placeholders) {
135-
foreach ($placeholders as $placeholder) {
136-
if (false !== stripos($value, $placeholder)) {
137-
$value = str_ireplace($placeholder, "%env($env)%", $value);
138-
}
139-
}
140-
}
141-
}
142-
143-
return $value;
117+
return null !== $this->processedEnvPlaceholders ? $this->processedEnvPlaceholders : parent::getEnvPlaceholders();
144118
}
145119
}

ContainerBuilder.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,10 +641,16 @@ public function merge(ContainerBuilder $container)
641641
}
642642

643643
if ($this->getParameterBag() instanceof EnvPlaceholderParameterBag && $container->getParameterBag() instanceof EnvPlaceholderParameterBag) {
644+
$envPlaceholders = $container->getParameterBag()->getEnvPlaceholders();
644645
$this->getParameterBag()->mergeEnvPlaceholders($container->getParameterBag());
646+
} else {
647+
$envPlaceholders = array();
645648
}
646649

647650
foreach ($container->envCounters as $env => $count) {
651+
if (!$count && !isset($envPlaceholders[$env])) {
652+
continue;
653+
}
648654
if (!isset($this->envCounters[$env])) {
649655
$this->envCounters[$env] = $count;
650656
} else {

Tests/Compiler/MergeExtensionConfigurationPassTest.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,13 @@ public function testOverriddenEnvsAreMerged()
7676
$container = new ContainerBuilder();
7777
$container->registerExtension(new FooExtension());
7878
$container->prependExtensionConfig('foo', array('bar' => '%env(FOO)%'));
79-
$container->prependExtensionConfig('foo', array('bar' => '%env(BAR)%'));
79+
$container->prependExtensionConfig('foo', array('bar' => '%env(BAR)%', 'baz' => '%env(BAZ)%'));
8080

8181
$pass = new MergeExtensionConfigurationPass();
8282
$pass->process($container);
8383

84-
$this->assertSame(array('FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
84+
$this->assertSame(array('BAZ', 'FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
85+
$this->assertSame(array('BAZ' => 1, 'FOO' => 0), $container->getEnvCounters());
8586
}
8687
}
8788

@@ -94,6 +95,7 @@ public function getConfigTreeBuilder()
9495
$rootNode
9596
->children()
9697
->scalarNode('bar')->end()
98+
->scalarNode('baz')->end()
9799
->end();
98100

99101
return $treeBuilder;
@@ -116,5 +118,10 @@ public function load(array $configs, ContainerBuilder $container)
116118
{
117119
$configuration = $this->getConfiguration($configs, $container);
118120
$config = $this->processConfiguration($configuration, $configs);
121+
122+
if (isset($config['baz'])) {
123+
$container->getParameterBag()->get('env(BOZ)');
124+
$container->resolveEnvPlaceholders($config['baz']);
125+
}
119126
}
120127
}

0 commit comments

Comments
 (0)