【问题标题】:Laravel: what's the difference between Mail::queue and $this->dispatch?Laravel:Mail::queue 和 $this->dispatch 有什么区别?
【发布时间】:2016-11-14 12:35:47
【问题描述】:

所以我目前正在阅读有关邮件队列的 Laravel 文档,但我已经失去了这个想法,Mail::queue(<params>) 和 $this->dispatch(new SendMail(<params>)) 之间有什么区别。因为在 Laravel 文档的 Mail 部分中给出了第一个变体,但后来有人说“不要忘记先配置你的队列”。我去了队列配置部分,在那里我发现“添加一些东西到队列只需使用$this->dispatch($job)”。

所以,我制作了两种变体:其中一种如下所示:

Mail::queue('emails.template', 
   ['name'=>$name, 'msg'=>$message], 
   function($msg) use ($email){
   $msg->to($email)
   ->subject('Application received');
  }
);

第二个,在同一个控制器中,但其他方法,只是:

$this->dispatch(new SendEmail($name, $message, $email));

在第二个变体中,我使用了作业,handle() 方法与之前的代码相同,只是使用了Mail::send。

在这两种变体中,用户必须等待同样长的时间,php artisan queue:listen 保持沉默,但电子邮件发送成功。

我应该怎么做才能澄清我的情况?非常感谢任何可能的帮助!

【问题讨论】:

  • 1.如果您希望邮件由同一个工作人员发送,请使用 mail::send()。 2. 如果您有单独的邮件队列并由单独的工作人员处理,请使用 mail::queue()。

标签: php laravel email queue laravel-5.2


【解决方案1】:

就像 Laravel 的许多部分一样,通常有一种简单的方法来做某事,然后是一种让你有更多控制权的方法。这两种发送电子邮件的方法略有不同。让我们来看看他们两个......

Mail::queue()

  • 使用外观访问器
  • 实际方法位于Illuminate\Mail\Mailer::queue()
  • 通过接收电子邮件模板/视图、任何关联的发送数据以及我们想要指定的回调函数来为您完成繁重的工作
  • 真正可以在任何地方调用,无需额外配置或创建新类
  • 将为您将要发送的新电子邮件直接推送到队列中。

$this->dispatch(new SendReminderEmail())

  • 手动分派作业(在本例中为 SendReminderEmail 作业实例)
  • 需要在控制器中使用,因为关联的 dispatch 方法仅在 DispatchesJobs 特征中可用。
  • 此方法调度关联的作业。在此示例中,暗示SendReminderEmail 实际上将推送新电子邮件发送到队列。
  • 如果您想加强对实际分派工作的控制,则使用此选项。您可以在此处添加与发送电子邮件相关的任何其他功能。例如,可能有自定义逻辑在发送电子邮件之前对其内容进行过滤。
  • 您需要手动创建作业,而 Mail 外观已经包含作业,隐藏在我们的实现之外。

有点遗憾的是,5.2 文档使用邮件作为分发事件的示例,因为大多数开发人员只会使用Mail::queue()。此处避免了混淆。

至于队列的速度,我不确定为什么您的队列会比预期的慢,抱歉!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 2010-11-06
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多