Laravel通知-如果满足条件,则延迟发送电子邮件并取消邮件

时间:2018-09-24 16:31:36

标签: laravel laravel-5 laravel-queue laravel-mail laravel-notification

我有一个应用程序,我要在其中发送一个推送通知,如果用户已登录该应用程序就很好-但是,如果不是,或者他们没有在X分钟内阅读通知,我想发送给他们发电子邮件。

我要解决的方法是使用Laravel Notifications创建邮件,广播和数据库通知。在toMail()方法中,我将延迟返回一个可邮寄邮件-

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

几分钟后,电子邮件将发送但是,在发送继续之前,我想检查一下是否已将推送/数据库通知标记为已读和如果已取消电子邮件发送。我能想到的唯一方法是绑定到Laravel中产生的MessageSending事件-

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

唯一的问题是此侦听器接收到Swift邮件事件,而不是我发送的原始邮件,因此我不知道如何取消它。有什么想法要先感谢吗?

1 个答案:

答案 0 :(得分: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;
}

有关更多详细信息,请参见文章Handling delayed notifications in Laravel