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保护,仅适合测试。