我在Laravel 5计划中设置了一些命令。输出存储在文件中并通过电子邮件发送给我。
由于该项目有几个"副本",我想使用环境名称来判断电子邮件来自哪个副本。
我尝试在时间表描述中使用app()->environment()
,它抛出了一个错误:
Fatal error: Uncaught exception 'ReflectionException' with message 'Class env does not exist' in ...
我也尝试了getenv('APP_ENV')
——这不会导致任何错误,但我得到了一个空白的环境名称。
App::environment()
也不起作用。
如果我在常规请求中使用它们(例如控制器操作或视图),所有这些都可以正常工作。
运行计划时,是否有方法确定当前环境?
感谢
我找到了一个解决方案。
在我的App''Console''Kernel调度方法中,就在设置应用程序所有调度之前,我添加了一行:
Dotenv::required('APP_ENV');
请记住,由于名称空间的原因,您必须使用use Dotenv;
或在上面的行中添加''。
通过这种方式,系统"确保"加载了APP_ENV,并且app()->environment()
返回了正确的环境名称。
另一个答案不适用于Laravel 5.3,因为不应静态调用Dotenv
。此外,它还需要.env
文件的路径作为第一个参数。
你可以使用这个(假设你在/app/Providers/AppServiceProvider.php
内):
$env = new Dotenv(realpath(__DIR__.'/../../'.'.env'));
$env->required('APP_ENV');
更好的方法是在调用调度程序时定义环境,例如:
php artisan schedule:run --env=local