Laravel .env 文件值 are read by Laravel 在应用程序启动时并存储在 PHP $_ENV global array 的相应键下。
您可以更改任何 Laravel(或其他 $_ENV)的值,如下所示:
// Assign the key's new value in the $_ENV global array
$_ENV['DB_CONNECTION'] = 'sqlite';
但是,Laravel 是否会考虑您的更改取决于您在代码中放置此作业的位置。
开发、登台、生产环境:
在内存中为这些环境动态更改 env 值是个坏主意。
尽管如此,要进行此更改,您必须在框架实例化 LoadEnvironmentVariables 类之前将您的分配放在 Laravel 引导文件中(对于 Lumen,实例化发生在 /bootstrap/app.php 文件中,对于 Laravel,您可以将您的更改放在同一个应用程序实例化之前的文件)。
测试环境
但是,对于测试环境,更改 env 变量有时会很有用。
在 the PHPUnit capability 之上在测试加载时更改环境变量(例如,请参阅项目文件夹中的 Laravel 的 phpunit.xml):
<php>
<env name="DB_CONNECTION" value="sqlite"/>
</php>
您可以更改 PHPUnit's setUp function 中的变量(Laravel 中的 also bootstraps the application - 注意测试扩展了 Laravel TestCase),如下所示:
public $savedDBConnection;
public function setUp():void
{
$this->savedDBConnection = $_ENV['DB_CONNECTION'];
$_ENV['DB_CONNECTION'] = 'mysql';
parent::setUp();
}
警告
通常您可能会面临这种动态变化带来的令人不快的副作用(例如,您使用内存数据库进行测试并暂时切换到磁盘测试数据库,而其他一些测试的database refresh 会擦除您的磁盘测试数据库数据)。
为避免这种情况,您必须先保存变量,然后在 setUp 方法中更改它们(如上所示)并在 tearDown method 中恢复它们,如下所示:
public function tearDown():void
{
$_ENV['DB_CONNECTION'] = $this->savedDBConnection;
parent::tearDown();
}
替代方案
还有另一种有时更适用的方法来更改测试环境的.env 变量(致谢here。):创建.env.testing 文件并在测试时加载它。简而言之,按照cmets中的说明添加以下colde
// Add in tests/TestCase.php::createApplication() method
// below $app = require __DIR__.'/../bootstrap/app.php' call.
if (file_exists(dirname(__DIR__) . '/.env.testing')) {
(new \Dotenv\Dotenv(dirname(__DIR__), '.env.testing'))->load();
}
现在有足够的信息来决定是否、何时或如何需要/可以动态更改环境变量。