8000 bug #23799 [Dotenv][WebServerBundle] Override previously loaded varia… · symfony/symfony@2204f91 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2204f91

Browse files
committed
bug #23799 [Dotenv][WebServerBundle] Override previously loaded variables (voronkovich)
This PR was squashed before being merged into the 3.3 branch (closes #23799). Discussion ---------- [Dotenv][WebServerBundle] Override previously loaded variables | Q | A | ------------- | --- | Branch? | 3.3 | Bug fix? | yes | New feature? | no | BC breaks? | yes | Deprecations? | no | Tests pass? | yes | Fixed tickets | #23723 | License | MIT This PR implements @nicolas-grekas's idea about how we could refresh loaded environment variables. See his comment #23723 (comment) Commits ------- c5a1218 [Dotenv][WebServerBundle] Override previously loaded variables
2 parents e6d0368 + c5a1218 commit 2204f91

File tree

3 files changed

+75
-2
lines changed

3 files changed

+75
-2
lines changed

src/Symfony/Bundle/WebServerBundle/WebServer.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ private function createServerProcess(WebServerConfig $config)
154154
$process->setWorkingDirectory($config->getDocumentRoot());
155155
$process->setTimeout(null);
156156

157+
if (in_array('APP_ENV', explode(',', getenv('SYMFONY_DOTENV_VARS')))) {
158+
$process->setEnv(array('APP_ENV' => false));
159+
$process->inheritEnvironmentVariables();
160+
}
161+
157162
return $process;
158163
}
159164

src/Symfony/Component/Dotenv/Dotenv.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,32 @@ public function load($path/*, ...$paths*/)
6060
/**
6161
* Sets values as environment variables (via putenv, $_ENV, and $_SERVER).
6262
*
63-
* Note that existing environment variables are never overridden.
63+
* Note that existing environment variables are not overridden.
6464
*
6565
* @param array $values An array of env variables
6666
*/
6767
public function populate($values)
6868
{
69+
$loadedVars = array_flip(explode(',', getenv('SYMFONY_DOTENV_VARS')));
70+
unset($loadedVars['']);
71+
6972
foreach ($values as $name => $value) {
70-
if (isset($_ENV[$name]) || isset($_SERVER[$name]) || false !== getenv($name)) {
73+
if (!isset($loadedVars[$name]) && (isset($_ENV[$name]) || isset($_SERVER[$name]) || false !== getenv($name))) {
7174
continue;
7275
}
7376

7477
putenv("$name=$value");
7578
$_ENV[$name] = $value;
7679
$_SERVER[$name] = $value;
80+
81+
$loadedVars[$name] = true;
82+
}
83+
84+
if ($loadedVars) {
85+
$loadedVars = implode(',', array_keys($loadedVars));
86+
putenv("SYMFONY_DOTENV_VARS=$loadedVars");
87+
$_ENV['SYMFONY_DOTENV_VARS'] = $loadedVars;
88+
$_SERVER['SYMFONY_DOTENV_VARS'] = $loadedVars;
7789
}
7890
}
7991

src/Symfony/Component/Dotenv/Tests/DotenvTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,60 @@ public function testEnvVarIsNotOverriden()
214214

215215
$this->assertSame('original_value', getenv('TEST_ENV_VAR'));
216216
}
217+
218+
public function testMemorizingLoadedVarsNamesInSpecialVar()
219+
{
220+
// Special variable not exists
221+
unset($_ENV['SYMFONY_DOTENV_VARS']);
222+
unset($_SERVER['SYMFONY_DOTENV_VARS']);
223+
putenv('SYMFONY_DOTENV_VARS');
224+
225+
unset($_ENV['APP_DEBUG']);
226+
unset($_SERVER['APP_DEBUG']);
227+
putenv('APP_DEBUG');
228+
unset($_ENV['DATABASE_URL']);
229+
unset($_SERVER['DATABASE_URL']);
230+
putenv('DATABASE_URL');
231+
232+
$dotenv = new DotEnv();
233+
$dotenv->populate(array('APP_DEBUG' => '1', 'DATABASE_URL' => 'mysql://root@localhost/db'));
234+
235+
$this->assertSame('APP_DEBUG,DATABASE_URL', getenv('SYMFONY_DOTENV_VARS'));
236+
237+
// Special variable has a value
238+
$_ENV['SYMFONY_DOTENV_VARS'] = 'APP_ENV';
239+
$_SERVER['SYMFONY_DOTENV_VARS'] = 'APP_ENV';
240+
putenv('SYMFONY_DOTENV_VARS=APP_ENV');
241+
242+
$_ENV['APP_DEBUG'] = '1';
243+
$_SERVER['APP_DEBUG'] = '1';
244+
putenv('APP_DEBUG=1');
245+
unset($_ENV['DATABASE_URL']);
246+
unset($_SERVER['DATABASE_URL']);
247+
putenv('DATABASE_URL');
248+
249+
$dotenv = new DotEnv();
250+
$dotenv->populate(array('APP_DEBUG' => '0', 'DATABASE_URL' => 'mysql://root@localhost/db'));
251+
$dotenv->populate(array('DATABASE_URL' => 'sqlite:///somedb.sqlite'));
252+
253+
$this->assertSame('APP_ENV,DATABASE_URL', getenv('SYMFONY_DOTENV_VARS'));
254+
}
255+
256+
public function testOverridingEnvVarsWithNamesMemorizedInSpecialVar()
257+
{
258+
putenv('SYMFONY_DOTENV_VARS=FOO,BAR,BAZ');
259+
260+
putenv('FOO=foo');
261+
putenv('BAR=bar');
262+
putenv('BAZ=baz');
263+
putenv('DOCUMENT_ROOT=/var/www');
264+
265+
$dotenv = new DotEnv();
266+
$dotenv->populate(array('FOO' => 'foo1', 'BAR' => 'bar1', 'BAZ' => 'baz1', 'DOCUMENT_ROOT' => '/boot'));
267+
268+
$this->assertSame('foo1', getenv('FOO'));
269+
$this->assertSame('bar1', getenv('BAR'));
270+
$this->assertSame('baz1', getenv('BAZ'));
271+
$this->assertSame('/var/www', getenv('DOCUMENT_ROOT'));
272+
}
217273
}

0 commit comments

Comments
 (0)
0