Laravel Mailable очередь, как передать пользовательские данные в событие MessageSent

Я использую 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 передаются из метода build () в классе Mailable, 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 работает нормально без очереди, однако при использовании очереди она будет возвращать ноль

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

Вопрос в том, как правильно передать пользовательские данные в событие MailSent при использовании очереди?

Или существует возможность, что job_request_id теряется при использовании очереди и передаче в withSwiftMessage (), поэтому слушатель событий только что получил нулевое значение?

Спасибо

1

Решение

Если вы используете Supervisor в качестве работника очереди. Попробуйте перезапустить весь процесс. Supervisor необходимо перезагрузить, чтобы отразить последние изменения в вашем коде.

sudo supervisorctl restart all
0

Другие решения

Мэйби, это может помочь тебе
https://medium.com/@guysmilez/queuing-mailables-with-custom-headers-in-laravel-5-4-ab615f022f17

Согласно этому сообщению, переменные теряются, когда вы помещаете почтовое сообщение в очередь, поэтому вы должны переопределить метод отправки Mailable.

0

любой public свойства на Mailable сохраняются в data атрибут в событии.

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

Теперь в вашем слушателе вы можете получить имя свойства в виде индекса массива data

var_dump($event->data['job_request_id']);
0
По вопросам рекламы [email protected]