【问题标题】:Laravel (vlucas/phpdotenv) changing env values dynamicallyLaravel (vlucas/phpdotenv) 动态改变环境值
【发布时间】:2021-06-20 20:33:17
【问题描述】:

在我的测试用例中,我尝试更改一些环境变量以创建更好的测试用例覆盖率。

Laravel 默认只支持env($key, $default = null) 获取环境变量,我无法更改变量。

Illuminate\Support\Env只支持get,不支持set

另外,Laravel 默认使用vlucas/phpdotenv 来管理环境变量。他们中的大多数人都在使用ImmutableWriter

有什么简单的方法可以支持动态变化的环境变量存储在ImmutableWriter中。

同样,出于安全原因,没有必要(也不应该)在生产中实施该解决方案。

【问题讨论】:

    标签: laravel lumen phpdotenv


    【解决方案1】:

    PHP 7+ Closure 有一些有趣的特性,可以绕过私有/受保护的检查。 它非常 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保护,只适合测试。

    【讨论】:

      猜你喜欢
      • 2021-03-26
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2020-02-10
      • 1970-01-01
      • 2019-10-30
      • 2015-10-07
      相关资源
      最近更新 更多