Я использую 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 (), поэтому слушатель событий только что получил нулевое значение?
Спасибо
Если вы используете Supervisor в качестве работника очереди. Попробуйте перезапустить весь процесс. Supervisor необходимо перезагрузить, чтобы отразить последние изменения в вашем коде.
sudo supervisorctl restart all
Мэйби, это может помочь тебе
https://medium.com/@guysmilez/queuing-mailables-with-custom-headers-in-laravel-5-4-ab615f022f17
Согласно этому сообщению, переменные теряются, когда вы помещаете почтовое сообщение в очередь, поэтому вы должны переопределить метод отправки Mailable.
любой public
свойства на Mailable сохраняются в data
атрибут в событии.
class CustomEmailNotification extends Mailable implements ShouldQueue
{
public $job_request_id = 1;
}
Теперь в вашем слушателе вы можете получить имя свойства в виде индекса массива data
var_dump($event->data['job_request_id']);