Laravel Config :: set()似乎不适用于排队的工作

时间:2019-07-06 17:40:59

标签: php laravel laravel-queue

  1. 我需要动态修改邮件SMTP参数,例如MAIL_HOSTMAIL_USERNAME

  2. 为此,我正在使用Config::set()动态设置这些值。

# This code works 
Config::set('mail.host', 'smtp.gmail.com');
Mail::to('user@example.com')->send(new myMailable());
  1. 如果我不将邮件排队,则上面的代码有效。

  2. 当我排队时,似乎Config::set()无法设置值。

测试以确认Config::set()不能用于排队的作业-

我创建了一个简单的作业,并将以下代码放入处理程序中。

public function handle()
{
    # set the config
    Config::set('mail.host', 'smtp.gmail.com');

    # confirm config has been set correctly
    logger('Setting host to = [' . config('mail.host') . ']');
}

上面的代码创建下面的日志条目。

Setting host to = []

为什么我不能即时更改已排队的作业的Config?以及如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

这是因为Queue worker不使用当前请求。这是一个独立的过程,不会受到配置设置的干扰。

要使其正常工作,您需要使用作业。调度功能获取您的数据,并将其发送到作业本身。在您的控制器中,致电:

JobName::dispatch($user, $settings);

在作业中,您可以相应地设置变量:

public function __construct($user, $settings)
    {
        $this->user = $user;
        $this->settings = $settings;
}

然后使用 handle 方法:

\Notification::sendNow($this->user, new Notification($this->settings));

您可以为此使用常规通知。 请勿将实施ShouldQueue 添加到您的工作中!

答案 1 :(得分:-2)

可以通过传递键/值对的数组来使用配置帮助器在运行时设置配置变量。

config(['mail.host' => 'smtp.gmail.com']);