Laravel 通知 - 延迟电子邮件发送并在满足条件时取消
Laravel Notifications - delay email sending and cancel if condition met
我有一个应用程序,我在其中发送推送通知,如果用户已登录该应用程序,这很好 - 但是,如果他们没有/如果他们没有在 X 分钟内阅读通知,我希望向他们发送电子邮件。
我要解决这个问题的方法是使用 Laravel 通知来创建邮件、广播和数据库通知。在 toMail()
方法中,我会延迟返回可邮寄的邮件 -
public function toMail($notifiable)
{
return (new \App\Mail\Order\NewOrder($this->order))
->delay(now()->addMinutes(10));
}
分钟结束后,电子邮件将发送 但是 ,在继续发送之前,我想检查一下 push/database 通知是否已被标记为已读,如果它已取消电子邮件发送。我能想到的唯一方法是绑定到烘焙到 Laravel -
中的 MessageSending
事件
// listen for emails being sent
'Illuminate\Mail\Events\MessageSending' => [
'App\Listeners\Notification\SendingEmail'
],
唯一的问题是这个侦听器收到了一个 Swift 邮件事件,而不是我发送的原始邮件事件,所以我不知道如何取消它。有什么想法并提前致谢吗?
Class 扩展通知
public function via($notifiable)
{
if($this->dontSend($notifiable)) {
return [];
}
return ['mail'];
}
public function dontSend($notifiable)
{
return $this->appointment->status === 'cancelled';
}
Class 事件服务提供商
protected $listen = [
NotificationSending::class => [
NotificationSendingListener::class,
],
];
Class NotificationSendingListener
public function handle(NotificationSending $event)
{
if (method_exists($event->notification, 'dontSend')) {
return !$event->notification->dontSend($event->notifiable);
}
return true;
}
我有一个应用程序,我在其中发送推送通知,如果用户已登录该应用程序,这很好 - 但是,如果他们没有/如果他们没有在 X 分钟内阅读通知,我希望向他们发送电子邮件。
我要解决这个问题的方法是使用 Laravel 通知来创建邮件、广播和数据库通知。在 toMail()
方法中,我会延迟返回可邮寄的邮件 -
public function toMail($notifiable)
{
return (new \App\Mail\Order\NewOrder($this->order))
->delay(now()->addMinutes(10));
}
分钟结束后,电子邮件将发送 但是 ,在继续发送之前,我想检查一下 push/database 通知是否已被标记为已读,如果它已取消电子邮件发送。我能想到的唯一方法是绑定到烘焙到 Laravel -
中的MessageSending
事件
// listen for emails being sent
'Illuminate\Mail\Events\MessageSending' => [
'App\Listeners\Notification\SendingEmail'
],
唯一的问题是这个侦听器收到了一个 Swift 邮件事件,而不是我发送的原始邮件事件,所以我不知道如何取消它。有什么想法并提前致谢吗?
Class 扩展通知
public function via($notifiable)
{
if($this->dontSend($notifiable)) {
return [];
}
return ['mail'];
}
public function dontSend($notifiable)
{
return $this->appointment->status === 'cancelled';
}
Class 事件服务提供商
protected $listen = [
NotificationSending::class => [
NotificationSendingListener::class,
],
];
Class NotificationSendingListener
public function handle(NotificationSending $event)
{
if (method_exists($event->notification, 'dontSend')) {
return !$event->notification->dontSend($event->notifiable);
}
return true;
}