Laravel可邮件队列,如何将自定义数据传递给MessageSent事件

7
我正在使用 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);
}

“extra data job_request_id 是从 Mailable 类的 build() 方法中传递的,位于 CustomEmailNotification.php 文件中。”
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是否会丢失,因此事件侦听器只会收到null值?
谢谢
3个回答

6
任何Mailable上的公共属性都将保存到事件中的data属性中。
class CustomEmailNotification extends Mailable implements ShouldQueue
{
    public $job_request_id = 1;
}

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

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

2

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

sudo supervisorctl restart all

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接