代码之家  ›  专栏  ›  技术社区  ›  Jeff Puckett

如何在运行时更改应用程序环境?

  •  1
  • Jeff Puckett  · 技术社区  · 8 年前

    如何在运行时更改应用程序环境?

    我有一些类只在生产中的服务提供者中绑定。我想用一个单元测试断言它们是正确绑定的。对于其他环境变量,我可以用 config 然后简单地调用 resetApplication 在里面 tearDown 但出于某种原因 APP_ENV 不会改变。

    dump(app()->environment()); // "testing"
    
    config(['app.env' => 'production']);
    
    dump(app()->environment()); // "testing"
    

    我能做些什么 app()->environment() 返回 production 在运行时?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Jeff Puckett    8 年前

    app()->environment() 直接从.env文件中指定的变量而不是配置文件中读取。

    你可以采取两种方法来解决你的问题。

    1。从配置文件而不是.env文件读取环境变量。

    dump(config('app.env')); // "testing"
    
    config(['app.env' => 'production']);
    
    dump(config('app.env')); // "production"
    

    2。更改当前应用程序实例中“env”的值,方法是更改 app()['env'] .

    dump(app()->environment()); // "testing"
    
    app()['env'] = 'production';
    
    dump(app()->environment()); // "production"
    
        2
  •  0
  •   okdewit    7 年前

    我注意到上面的答案可能有点危险:您可能覆盖了“env”键,而没有真正的切换环境。突然间,你的应用程序说你正在测试,而你的数据库连接仍然设置为生产。

    通常,您只想真正坚持为每个文本环境定义一个环境的Laravel最佳实践,但对于我的用例,我需要在单个Artisan脚本中的多个环境之间临时和以编程方式切换。

    我的解决方案(适用于Laravel 5.8+和Dotenv3)是真正重新启动应用程序:

    <?php
    
    $basepath = app()->basePath();
    $env = app()->basePath('.env.alternative');
    $boot = app()->basePath('bootstrap/app.php');
    
    // Overwrite webserver env
    (new Dotenv($basepath,'.env.alternative'))->overload();
    
    // Reboot the application
    (require $boot)
        ->loadEnvironmentFrom($env)
        ->make(Kernel::class)
        ->bootstrap();
    
    // This returns 'mysql_alternative', as defined in .env.alternative
    dd(DB::connection()->getName())
    
    

    免责声明:我只测试了我自己代码的扩展。