首页 > 解决方案 > Laravel Config::set() 似乎不适用于排队作业

问题描述

  1. 我需要动态修改邮件SMTPMAIL_HOST参数MAIL_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即时更改排队作业?以及如何解决这个问题?

标签: phplaravellaravel-queue

解决方案


这是因为队列工作者不使用当前请求。这是一个独立的过程,不受配置设置的干扰。

要让它工作,您需要使用 Job。dispatch 函数获取您的数据并将其发送到作业本身。从您的控制器调用:

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添加到您的工作中!


推荐阅读