4

我有一个应用程序,我正在发送推送通知,如果用户登录到应用程序,这很好 - 但是,如果他们没有/如果他们没有在 X 分钟内阅读通知,我想给他们发送一封电子邮件.

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

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

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

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

唯一的问题是这个监听器接收到一个 Swift 邮件事件,而不是我发送的原始邮件,所以我不知道如何取消它。任何想法和提前感谢?

4

1 回答 1

4

类扩展通知

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 中处理延迟通知

于 2018-12-15T14:34:52.363 回答