[Dotenv][WebServerBundle] Override previously loaded variables

This commit is contained in:
Oleg Voronkovich 2017-08-06 03:05:34 +03:00 committed by Fabien Potencier
parent 049785b11b
commit c5a1218555
3 changed files with 75 additions and 2 deletions

View File

@ -154,6 +154,11 @@ class WebServer
$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;
}

View File

@ -60,20 +60,32 @@ final class Dotenv
/**
* Sets values as environment variables (via putenv, $_ENV, and $_SERVER).
*
* Note that existing environment variables are never overridden.
* Note that existing environment variables are not overridden.
*
* @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;
}
if ($loadedVars) {
$loadedVars = implode(',', array_keys($loadedVars));
putenv("SYMFONY_DOTENV_VARS=$loadedVars");
$_ENV['SYMFONY_DOTENV_VARS'] = $loadedVars;
$_SERVER['SYMFONY_DOTENV_VARS'] = $loadedVars;
}
}

View File

@ -214,4 +214,60 @@ class DotenvTest extends TestCase
$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'));
}
}