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

Php Laravel Mailable队列,如何将自定义数据传递给MessageSent事件,php,laravel-mail,laravel-events,Php,Laravel Mail,Laravel Events,我正在使用Laravel Mailable发送电子邮件,我想记录成功发送的电子邮件 Laravel Mailable具有在发送电子邮件后激发的默认事件 所以我把我的听众吸引到这个事件上 protected $listen = [ 'App\Events\Event' => [ 'App\Listeners\EventListener', ], 'Illuminate\Mail\Events\MessageSent'

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

Laravel Mailable具有在发送电子邮件后激发的默认事件

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

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);
}
额外的数据作业\u请求\u 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类上的这一行在没有queue的情况下运行良好,但是当使用queue时,它将返回null

 //get extra data 
 $job_request_id = $event->message->job_request_id;
 var_dump($job_request_id);
 //null when using queue
问题是,在使用队列时,将自定义数据传递给MailSent事件的正确方法是什么

或者,在使用queue并传递给WithWiftMessage()时,作业请求id是否可能丢失,因此事件侦听器刚刚收到空值


如果您使用主管作为队列工作人员,请感谢。尝试重新启动所有进程。必须重新加载Supervisor以反映代码最近的更改

sudo supervisorctl restart all
也许这对你有帮助


根据这篇文章,当您将邮件放入队列时,变量将丢失,因此您必须覆盖邮件的发送方法,邮件上的任何
public
属性都将保存到事件中的
数据
属性中

class CustomEmailNotification extends Mailable implements ShouldQueue
{
    public $job_request_id = 1;
}
现在,在侦听器中,您可以将属性名称作为
数据的数组索引

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