运行schedule时获取laravel环境

问题描述 投票:0回答:4

我在 Laravel 5 时间表中设置了一些命令。输出存储在文件中并通过电子邮件发送给我。

由于该项目有多个“副本”,我想使用环境名称来区分电子邮件来自哪个副本。

我尝试在日程描述中使用

app()->environment()
- 它会抛出错误:

Fatal error: Uncaught exception 'ReflectionException' with message 'Class env does not exist' in ...

我也尝试了

getenv('APP_ENV')
- 这不会导致任何错误,但我得到一个空白的环境名称。

App::environment()
也没有用。

如果我在常规请求(例如控制器操作或视图)中使用它们,所有这些都可以正常工作。

有没有办法在运行计划时确定当前环境?

谢谢你

php laravel environment schedule
4个回答
3
投票

我找到了解决方案。

在我的 App\Console\Kernel 调度方法中,在设置应用程序所有调度之前,我添加了一行:

Dotenv::required('APP_ENV');

请记住,由于命名空间的原因,您必须

use Dotenv;
或在上面的行中添加 \。

这样系统“确保”APP_ENV 已加载并且

app()->environment()
返回正确的环境名称。


1
投票

另一个答案不适用于 Laravel 5.3,因为

Dotenv
不应该被静态调用。此外,它需要
.env
文件的路径作为第一个参数。

你可以用这个代替(假设你在里面

/app/Providers/AppServiceProvider.php
):

$env = new Dotenv(realpath(__DIR__.'/../../'.'.env'));
$env->required('APP_ENV');

0
投票

如果您使用的是最新版本的 Laravel(例如 v9/v10),这似乎是正确的方法

https://laravel.com/docs/10.x/scheduling#environment-constraints

$schedule->command('emails:send')
        ->daily()
        ->environments(['staging', 'production']);

-1
投票

更好的方法是在调用调度器时定义环境,例如:

php artisan schedule:run --env=local
© www.soinside.com 2019 - 2024. All rights reserved.