Уведомления Laravel - отложите отправку электронной почты и отмените, если условие выполнено

У меня есть приложение, в котором я отправляю push-уведомление, которое нормально, если пользователь вошел в приложение - однако, если они не / если они не прочитали уведомление в течение X минут, я хотел бы отправить им электронное письмо .

Я собираюсь использовать уведомления Laravel для создания уведомлений по почте, широковещательной рассылке и базе данных. По методу toMail() я возвращаю почтовое сообщение с задержкой -

public function toMail($notifiable)
{
    return (new \App\Mail\Order\NewOrder($this->order))
        ->delay(now()->addMinutes(10));
}

По истечении минут электронное письмо будет отправлено но до того, как отправка будет продолжена, я хотел бы выполнить проверку, чтобы увидеть, было ли уведомление push / базы данных уже помечено как прочитанное и было ли оно отменить отправку электронного письма. Единственный способ, которым я могу это сделать, - это привязаться к событию MessageSending, которое запечено в Laravel -

// listen for emails being sent
'Illuminate\Mail\Events\MessageSending' => [
    'App\Listeners\Notification\SendingEmail'
],

Единственная проблема заключается в том, что этот слушатель получает почтовое событие Swift, а не исходное почтовое сообщение, которое я отправлял, поэтому я не знаю, как его отменить. Есть идеи и заранее спасибо?


person Chris    schedule 24.09.2018    source источник


Ответы (1)


Класс расширяет уведомление

public function via($notifiable)
{
    if($this->dontSend($notifiable)) {
        return [];
    }
    return ['mail'];
}

public function dontSend($notifiable)
{
    return $this->appointment->status === 'cancelled';
}

Класс EventServiceProvider

protected $listen = [
    NotificationSending::class => [
        NotificationSendingListener::class,
    ],
];

Класс NotificationSendingListener

public function handle(NotificationSending $event)
{
    if (method_exists($event->notification, 'dontSend')) {
        return !$event->notification->dontSend($event->notifiable);
    }
    return true;
}

Подробнее см. Статью Обработка отложенных уведомлений в Laravel

person Community    schedule 15.12.2018
comment
Это не работает, возможно, это так, но dontsend не проверяется один раз в очереди - person Harry Bosh; 01.08.2019