From a49894516c38f89de84a4218c086108b9e18abfb Mon Sep 17 00:00:00 2001 From: Oleg Voronkovich Date: Sun, 6 Aug 2017 03:05:34 +0300 Subject: [PATCH 1/4] Override previously loaded variables --- .../Bundle/WebServerBundle/WebServer.php | 5 ++ src/Symfony/Component/Dotenv/Dotenv.php | 14 ++++- .../Component/Dotenv/Tests/DotenvTest.php | 56 +++++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bundle/WebServerBundle/WebServer.php b/src/Symfony/Bundle/WebServerBundle/WebServer.php index 8edbe2bf56ec2..e3425ec8bb13a 100644 --- a/src/Symfony/Bundle/WebServerBundle/WebServer.php +++ b/src/Symfony/Bundle/WebServerBundle/WebServer.php @@ -154,6 +154,11 @@ private function createServerProcess(WebServerConfig $config) $process->setWorkingDirectory($config->getDocumentRoot()); $process->setTimeout(null); + if (in_array('APP_ENV', explode(',', getenv('SYMFONY_DOTENV_VARS')))) { + $process->setEnv(array('APP_ENV' => false)); + $process->inheritEnvironmentVariables(); + } + return $process; } diff --git a/src/Symfony/Component/Dotenv/Dotenv.php b/src/Symfony/Component/Dotenv/Dotenv.php index 2e907b8c980b8..847364d8d386c 100644 --- a/src/Symfony/Component/Dotenv/Dotenv.php +++ b/src/Symfony/Component/Dotenv/Dotenv.php @@ -60,21 +60,31 @@ public function load($path/*, ...$paths*/) /** * Sets values as environment variables (via putenv, $_ENV, and $_SERVER). * - * Note that existing environment variables are never overridden. + * Existing environment variables are never overridden, unless they are listed in the SYMFONY_DOTENV_VARS env var. * * @param array $values An array of env variables */ public function populate($values) { + $loadedVars = array_flip(explode(',', getenv('SYMFONY_DOTENV_VARS'))); + unset($loadedVars['']); + foreach ($values as $name => $value) { - if (isset($_ENV[$name]) || isset($_SERVER[$name]) || false !== getenv($name)) { + if (!isset($loadedVars[$name]) && (isset($_ENV[$name]) || isset($_SERVER[$name]) || false !== getenv($name))) { continue; } putenv("$name=$value"); $_ENV[$name] = $value; $_SERVER[$name] = $value; + + $loadedVars[$name] = true; } + + $loadedVars = implode(',', array_keys($loadedVars)); + putenv("SYMFONY_DOTENV_VARS=$loadedVars"); + $_ENV['SYMFONY_DOTENV_VARS'] = $loadedVars; + $_SERVER['SYMFONY_DOTENV_VARS'] = $loadedVars; } /** diff --git a/src/Symfony/Component/Dotenv/Tests/DotenvTest.php b/src/Symfony/Component/Dotenv/Tests/DotenvTest.php index 47598030a87f1..dc1a7b5b2c4a7 100644 --- a/src/Symfony/Component/Dotenv/Tests/DotenvTest.php +++ b/src/Symfony/Component/Dotenv/Tests/DotenvTest.php @@ -214,4 +214,60 @@ public function testEnvVarIsNotOverriden() $this->assertSame('original_value', getenv('TEST_ENV_VAR')); } + + public function testMemorizingLoadedVarsNamesInSpecialVar() + { + // Special variable not exists + unset($_ENV['SYMFONY_DOTENV_VARS']); + unset($_SERVER['SYMFONY_DOTENV_VARS']); + putenv('SYMFONY_DOTENV_VARS'); + + unset($_ENV['APP_DEBUG']); + unset($_SERVER['APP_DEBUG']); + putenv('APP_DEBUG'); + unset($_ENV['DATABASE_URL']); + unset($_SERVER['DATABASE_URL']); + putenv('DATABASE_URL'); + + $dotenv = new DotEnv(); + $dotenv->populate(array('APP_DEBUG' => '1', 'DATABASE_URL' => 'mysql://root@localhost/db')); + + $this->assertSame('APP_DEBUG,DATABASE_URL', getenv('SYMFONY_DOTENV_VARS')); + + // Special variable has a value + $_ENV['SYMFONY_DOTENV_VARS'] = 'APP_ENV'; + $_SERVER['SYMFONY_DOTENV_VARS'] = 'APP_ENV'; + putenv('SYMFONY_DOTENV_VARS=APP_ENV'); + + $_ENV['APP_DEBUG'] = '1'; + $_SERVER['APP_DEBUG'] = '1'; + putenv('APP_DEBUG=1'); + unset($_ENV['DATABASE_URL']); + unset($_SERVER['DATABASE_URL']); + putenv('DATABASE_URL'); + + $dotenv = new DotEnv(); + $dotenv->populate(array('APP_DEBUG' => '0', 'DATABASE_URL' => 'mysql://root@localhost/db')); + $dotenv->populate(array('DATABASE_URL' => 'sqlite:///somedb.sqlite')); + + $this->assertSame('APP_ENV,DATABASE_URL', getenv('SYMFONY_DOTENV_VARS')); + } + + public function testOverridingEnvVarsWithNamesMemorizedInSpecialVar() + { + putenv('SYMFONY_DOTENV_VARS=FOO,BAR,BAZ'); + + putenv('FOO=foo'); + putenv('BAR=bar'); + putenv('BAZ=baz'); + putenv('DOCUMENT_ROOT=/var/www'); + + $dotenv = new DotEnv(); + $dotenv->populate(array('FOO' => 'foo1', 'BAR' => 'bar1', 'BAZ' => 'baz1', 'DOCUMENT_ROOT' => '/boot')); + + $this->assertSame('foo1', getenv('FOO')); + $this->assertSame('bar1', getenv('BAR')); + $this->assertSame('baz1', getenv('BAZ')); + $this->assertSame('/var/www', getenv('DOCUMENT_ROOT')); + } } From 1ebc908dff239ca336e12656ae8e3fa8fd9e5e7c Mon Sep 17 00:00:00 2001 From: Oleg Voronkovich Date: Sun, 6 Aug 2017 22:53:12 +0300 Subject: [PATCH 2/4] Move block inside 'if' --- src/Symfony/Component/Dotenv/Dotenv.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Dotenv/Dotenv.php b/src/Symfony/Component/Dotenv/Dotenv.php index 847364d8d386c..bd193fd17ea79 100644 --- a/src/Symfony/Component/Dotenv/Dotenv.php +++ b/src/Symfony/Component/Dotenv/Dotenv.php @@ -81,10 +81,12 @@ public function populate($values) $loadedVars[$name] = true; } - $loadedVars = implode(',', array_keys($loadedVars)); - putenv("SYMFONY_DOTENV_VARS=$loadedVars"); - $_ENV['SYMFONY_DOTENV_VARS'] = $loadedVars; - $_SERVER['SYMFONY_DOTENV_VARS'] = $loadedVars; + if ($loadedVars) { + $loadedVars = implode(',', array_keys($loadedVars)); + putenv("SYMFONY_DOTENV_VARS=$loadedVars"); + $_ENV['SYMFONY_DOTENV_VARS'] = $loadedVars; + $_SERVER['SYMFONY_DOTENV_VARS'] = $loadedVars; + } } /** From e7c7c1550ed094a2dac3c80cf9ca3b2043ec2263 Mon Sep 17 00:00:00 2001 From: Oleg Voronkovich Date: Fri, 18 Aug 2017 16:09:06 +0300 Subject: [PATCH 3/4] Remove comment about overriding existing envs --- src/Symfony/Component/Dotenv/Dotenv.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Symfony/Component/Dotenv/Dotenv.php b/src/Symfony/Component/Dotenv/Dotenv.php index bd193fd17ea79..6ef0eb0932fa6 100644 --- a/src/Symfony/Component/Dotenv/Dotenv.php +++ b/src/Symfony/Component/Dotenv/Dotenv.php @@ -60,8 +60,6 @@ public function load($path/*, ...$paths*/) /** * Sets values as environment variables (via putenv, $_ENV, and $_SERVER). * - * Existing environment variables are never overridden, unless they are listed in the SYMFONY_DOTENV_VARS env var. - * * @param array $values An array of env variables */ public function populate($values) From 7dc4d004eab8fd5486d39862b76a5fa07c59b3e1 Mon Sep 17 00:00:00 2001 From: Oleg Voronkovich Date: Tue, 22 Aug 2017 16:15:00 +0300 Subject: [PATCH 4/4] Revert comment --- src/Symfony/Component/Dotenv/Dotenv.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Symfony/Component/Dotenv/Dotenv.php b/src/Symfony/Component/Dotenv/Dotenv.php index 6ef0eb0932fa6..0d3c01d93639e 100644 --- a/src/Symfony/Component/Dotenv/Dotenv.php +++ b/src/Symfony/Component/Dotenv/Dotenv.php @@ -60,6 +60,8 @@ public function load($path/*, ...$paths*/) /** * Sets values as environment variables (via putenv, $_ENV, and $_SERVER). * + * Note that existing environment variables are not overridden. + * * @param array $values An array of env variables */ public function populate($values)