【问题标题】:Laravel Mailable queue, how to pass custom data to MessageSent eventLaravel Mailable 队列,如何将自定义数据传递给 MessageSent 事件
【发布时间】:2018-09-26 23:55:05
【问题描述】:

我正在使用 Laravel Mailable 发送电子邮件,我想记录发送成功的电子邮件。

Laravel Mailable 有在邮件发送后触发的默认事件

https://laravel.com/docs/5.6/mail#events

所以我把我的听众钩到这个事件上

protected $listen = [
        'App\Events\Event' => [
            'App\Listeners\EventListener',
        ],
        'Illuminate\Mail\Events\MessageSent' => [
            'App\Listeners\LogSentEmailNotification',
        ],
    ];

监听处理程序

public function handle(MessageSent $event)
{

    //get extra data 
    $job_request_id = $event->message->job_request_id;

    $message = $event->message;

    $data = [
        'job_request_id' => $job_request_id,
        'to' => $message->getHeaders()->get('To'),
        'from' => $message->getHeaders()->get('From'),
        'cc' => $message->getHeaders()->get('Cc'),
        'bcc' => $message->getHeaders()->get('Bcc'),
        'subject' => $message->getHeaders()->get('Subject')->getFieldBody(),
        'body' => $message->getBody(),
    ];

    $email_notification_log = $this->email_notification_log->create($data);
}

额外的数据job_request_id是从Mailable类CustomEmailNotification.php中的build()方法传递过来的

class CustomEmailNotification extends Mailable implements ShouldQueue
{

    public function build()
    {
        $job_request_id = 1;

        //pass extra data mail message            

        $this->withSwiftMessage(function ($message) use($job_request_id){
            $message->job_request_id = $job_request_id;
        });
    }
}

现在 Listener 类的这一行在没有队列的情况下工作正常,但是当使用队列时它会返回 null

 //get extra data 
 $job_request_id = $event->message->job_request_id;
 var_dump($job_request_id);
 //null when using queue

问题是,使用队列时将自定义数据传递给 MailSent 事件的正确方法是什么?

或者在使用队列并传递给withSwiftMessage()时是否有可能job_request_id丢失,所以事件监听器刚刚收到空值?

谢谢

【问题讨论】:

    标签: php laravel-mail laravel-events


    【解决方案1】:

    如果您使用 Supervisor 作为队列工作者。尝试重新启动所有进程。必须重新加载 Supervisor 以反映您的代码的最新更改。

    sudo supervisorctl restart all
    

    【讨论】:

      【解决方案2】:

      Mailable 上的任何public 属性都将保存到事件中的data 属性中。

      class CustomEmailNotification extends Mailable implements ShouldQueue
      {
          public $job_request_id = 1;
      }
      

      现在在您的侦听器中,您可以将属性名称作为data 的数组索引获取

      var_dump($event->data['job_request_id']);
      

      【讨论】:

        【解决方案3】:

        也许这可以帮助你 https://medium.com/@guysmilez/queuing-mailables-with-custom-headers-in-laravel-5-4-ab615f022f17

        根据这篇文章,当你将mailable放入队列时变量会丢失,所以你必须重写Mailable的send方法

        【讨论】:

          猜你喜欢
          • 2016-05-29
          • 2010-10-24
          • 2014-02-22
          • 1970-01-01
          • 2013-01-26
          • 1970-01-01
          • 2018-05-18
          • 2018-08-17
          • 2021-08-25
          相关资源
          最近更新 更多