8000 Fix/broken merging of parameter bag env placeholders · symfony/symfony@b53e0de · GitHub
[go: up one dir, main page]

Skip to content

Commit b53e0de

Browse files
mickadoonicolas-grekas
authored andcommitted
Fix/broken merging of parameter bag env placeholders
1 parent f065095 commit b53e0de

File tree

2 files changed

+82
-5
lines changed

2 files changed

+82
-5
lines changed

src/Symfony/Component/DependencyInjection/ParameterBag/EnvPlaceholderParameterBag.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ public function getEnvPlaceholders()
7171
*/
7272
public function mergeEnvPlaceholders(self $bag)
7373
{
74-
$this->envPlaceholders = array_merge_recursive($this->envPlaceholders, $bag->getEnvPlaceholders());
74+
if ($newPlaceholders = $bag->getEnvPlaceholders()) {
75+
$this->envPlaceholders += $newPlaceholders;
76+
77+
foreach ($newPlaceholders as $env => $placeholders) {
78+
$this->envPlaceholders[$env] += $placeholders;
79+
}
80+
}
7581
}
7682
}

src/Symfony/Component/DependencyInjection/Tests/ParameterBag/EnvPlaceholderParameterBagTest.php

Lines changed: 75 additions & 4 deletions
+
$placeholderForVariable = $mergedPlaceholders[$envVariableName];
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,87 @@ public function testGetThrowsInvalidArgumentExceptionIfEnvNameContainsNonWordCha
2626

2727
public function testMergeWillNotDuplicateIdenticalParameters()
2828
{
29-
$originalPlaceholders = array('database_host' => array('localhost'));
30-
$firstBag = new EnvPlaceholderParameterBag($originalPlaceholders);
29+
$envVariableName = 'DB_HOST';
30+
$parameter = sprintf('env(%s)', $envVariableName);
31+
$firstBag = new EnvPlaceholderParameterBag();
3132

3233
// initialize placeholders
33-
$firstBag->get('env(database_host)');
34+
$firstBag->get($parameter);
3435
$secondBag = clone $firstBag;
3536

3637
$firstBag->mergeEnvPlaceholders($secondBag);
3738
$mergedPlaceholders = $firstBag->getEnvPlaceholders();
3839

39-
$this->assertCount(1, $mergedPlaceholders['database_host']);
40
41+
$placeholder = array_values($placeholderForVariable)[0];
42+
43+
$this->assertCount(1, $placeholderForVariable);
44+
$this->assertInternalType('string', $placeholder);
45+
$this->assertContains($envVariableName, $placeholder);
46+
}
47+
48+
public function testMergeWhereFirstBagIsEmptyWillWork()
49+
{
50+
$envVariableName = 'DB_HOST';
51+
$parameter = sprintf('env(%s)', $envVariableName);
52+
$firstBag = new EnvPlaceholderParameterBag();
53+
$secondBag = new EnvPlaceholderParameterBag();
54+
55+
// initialize placeholder only in second bag
56+
$secondBag->get($parameter);
57+
58+
$this->assertEmpty($firstBag->getEnvPlaceholders());
59+
60+
$firstBag->mergeEnvPlaceholders($secondBag);
61+
$mergedPlaceholders = $firstBag->getEnvPlaceholders();
62+
63+
$placeholderForVariable = $mergedPlaceholders[$envVariableName];
64+
$placeholder = array_values($placeholderForVariable)[0];
65+
66+
$this->assertCount(1, $placeholderForVariable);
67+
$this->assertInternalType('string', $placeholder);
68+
$this->assertContains($envVariableName, $placeholder);
69+
}
70+
71+
public function testMergeWherePlaceholderOnlyExistsInSecond()
72+
{
73+
$uniqueEnvName = 'DB_HOST';
74+
$commonEnvName = 'DB_USER';
75+
76+
$uniqueParamName = sprintf('env(%s)', $uniqueEnvName);
77+
$commonParamName = sprintf('env(%s)', $commonEnvName);
78+
79+
$firstBag = new EnvPlaceholderParameterBag();
80+
// initialize common placeholder
81+
$firstBag->get($commonParamName);
82+
$secondBag = clone $firstBag;
83+
84+
// initialize unique placeholder
85+
$secondBag->get($uniqueParamName);
86+
87+
$firstBag->mergeEnvPlaceholders($secondBag);
88+
$merged = $firstBag->getEnvPlaceholders();
89+
90+
$this->assertCount(1, $merged[$uniqueEnvName]);
91+
// second bag has same placeholder for commonEnvName
92+
$this->assertCount(1, $merged[$commonEnvName]);
93+
}
94+
95+
public function testMergeWithDifferentIdentifiersForPlaceholders()
96+
{
97+
$envName = 'DB_USER';
98+
$paramName = sprintf('env(%s)', $envName);
99+
100+
$firstBag = new EnvPlaceholderParameterBag();
101+
$secondBag = new EnvPlaceholderParameterBag();
102+
// initialize placeholders
103+
$firstPlaceholder = $firstBag->get($paramName);
104+
$secondPlaceholder = $secondBag->get($paramName);
105+
106+
$firstBag->mergeEnvPlaceholders($secondBag);
107+
$merged = $firstBag->getEnvPlaceholders();
108+
109+
$this->assertNotEquals($firstPlaceholder, $secondPlaceholder);
110+
$this->assertCount(2, $merged[$envName]);
40111
}
41112
}

0 commit comments

Comments
 (0)
0