Laravel (vlucas/phpdotenv) 动态改变环境值
Laravel (vlucas/phpdotenv) changing env values dynamically
在我的测试用例中,我尝试更改一些环境变量以创建更好的测试用例覆盖率。
Laravel默认只支持env($key, $default = null)
获取环境变量,无法修改
Illuminate\Support\Env
只支持get
,不支持set
。
此外,默认情况下 Laravel 使用 vlucas/phpdotenv
来管理环境变量。他们中的大多数人都在使用 ImmutableWriter
.
有什么简单的方法可以支持动态变化的环境变量存储在ImmutableWriter
。
同样,出于安全原因,该解决方案没有必要(也不应该)在生产中实施。
PHP 7+ 闭包有一些有趣的特性,可以绕过private/protected检查。
它非常 hacky,但是,非常适合编写测试用例。
use Illuminate\Support\Env;
function resetEnvValue($name, $value)
{
$environmentRepository = Env::getRepository();
$fn = function () use ($name, $value) {
$fn = function() use ($name, $value) {
$this->writer->write($name, $value);
};
$fn->call($this->writer);
};
$fn->call($environmentRepository);
}
resetEnvValue('TIMER', 1);
var_dump(env('TIMER')); // int(1)
resetEnvValue('TIMER', 2);
var_dump(env('TIMER')); // int(2)
请不要在生产环境中使用,以上代码绕过了所有ImmutableWriter
保护,仅适合测试。
在我的测试用例中,我尝试更改一些环境变量以创建更好的测试用例覆盖率。
Laravel默认只支持env($key, $default = null)
获取环境变量,无法修改
Illuminate\Support\Env
只支持get
,不支持set
。
此外,默认情况下 Laravel 使用 vlucas/phpdotenv
来管理环境变量。他们中的大多数人都在使用 ImmutableWriter
.
有什么简单的方法可以支持动态变化的环境变量存储在ImmutableWriter
。
同样,出于安全原因,该解决方案没有必要(也不应该)在生产中实施。
PHP 7+ 闭包有一些有趣的特性,可以绕过private/protected检查。 它非常 hacky,但是,非常适合编写测试用例。
use Illuminate\Support\Env;
function resetEnvValue($name, $value)
{
$environmentRepository = Env::getRepository();
$fn = function () use ($name, $value) {
$fn = function() use ($name, $value) {
$this->writer->write($name, $value);
};
$fn->call($this->writer);
};
$fn->call($environmentRepository);
}
resetEnvValue('TIMER', 1);
var_dump(env('TIMER')); // int(1)
resetEnvValue('TIMER', 2);
var_dump(env('TIMER')); // int(2)
请不要在生产环境中使用,以上代码绕过了所有ImmutableWriter
保护,仅适合测试。