我在 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');
如果您使用的是最新版本的 Laravel(例如 v9/v10),这似乎是正确的方法
https://laravel.com/docs/10.x/scheduling#environment-constraints
$schedule->command('emails:send')
->daily()
->environments(['staging', 'production']);
更好的方法是在调用调度器时定义环境,例如:
php artisan schedule:run --env=local