如何在运行时更改应用环境?
我有一些只在生产中绑定在服务提供者中的类。我想通过单元测试断言它们是否正确绑定。对于其他环境变量,我可以使用config
帮助器设置它们,然后只需在resetApplication
中调用tearDown
但由于某种原因APP_ENV
设置的变量不会变化
dump(app()->environment()); // "testing"
config(['app.env' => 'production']);
dump(app()->environment()); // "testing"
如何让app()->environment()
在运行时返回production
?
答案 0 :(得分:2)
app()->environment()
直接从.env文件中指定的变量而不是配置文件中读取。
您可以采取两种方法来解决您的问题。
dump(config('app.env')); // "testing"
config(['app.env' => 'production']);
dump(config('app.env')); // "production"
app()['env']
。dump(app()->environment()); // "testing"
app()['env'] = 'production';
dump(app()->environment()); // "production"
答案 1 :(得分:0)
我注意到上面的答案可能有点危险:您可能会覆盖'env'键,而没有真正切换环境。突然,您的应用程序说您正在测试中,而数据库连接仍设置为正式生产。
通常,您只想真正遵循Laravel为每个文字环境定义一个环境的最佳实践,但是对于我的用例,我需要在单个工匠脚本中临时地以编程方式在多个环境之间进行切换。
我的解决方案(在带有DotEnv3的Laravel 5.8+中有效)将真正重新启动应用程序:
<?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())
免责声明:我只是在我自己的代码中进行了测试。