Laravel 安排推送通知并在必要时取消它
Laravel schedule push notification and cancel it if necessary
在我的 Laravel 后端应用程序中,用户可以互相发送消息。
我想在收到新收件箱消息时向应用程序用户发送推送通知,但只有在用户尚未阅读此消息时我才需要发送消息。
所以我是这样看的
- 对于每条发送的消息,我需要在 1 分钟后安排 Laravel 通知
- 如果用户已经收到此消息我需要取消此通知
如何关闭 Laravel 中的预定通知? 现在还好吗?
Class 扩展通知
public function via($notifiable)
{
if($this->dontSend($notifiable)) {
return [];
}
return ['mail'];
}
public function dontSend($notifiable)
{
return $this->appointment->status === 'cancelled';
}
也许有更方便的处理方式?例如,每次都发送推送,但如果它已经启动,则以某种方式关闭它从应用程序中显示?
一种方法是这样的;
- 在您触发通知之前,请结合
user_id
创建一个唯一标识符(sha1
可能是一个选项)。假设它是 SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C
。将其发送到通知。通知和消息会同时发送,但通知会延迟一分钟。
$identifier = Str::random(64);
$delay = now()->addMinute();
$user->notify((new MyNotification($identifier))->delay($delay));
// send a request that contains identifier.
- 你把这个设置为TTL为2分钟的Redis。不行动就没了
Redis::set('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C', 1, 120);
- 在向用户发送消息时,将此标识符附加到消息中。当用户阅读该消息时,您使用所有参数 + 标识符向您的 /read 端点发出请求。
- 收到请求后,从 Redis 中删除密钥。 (用户收到消息)
Redis::del('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C');
- 在你的 Notification class 中,实现一个小方法来检查 Redis 中是否存在键。
Redis::exists('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C');
class MyNotification extends BaseNotification
{
use Queueable;
private $identifier;
public function __construct($identifier)
{
$this->identifier = $identifier;
}
public function via()
{
return $this->isValid() ? ['mail'] : [];
}
public function isValid()
{
return Redis::exists($this->identifier);
}
public function toMail()
{
// details..
}
}
它不一定是 Redis,但它非常适合这种 key/value 结构。
在我的 Laravel 后端应用程序中,用户可以互相发送消息。
我想在收到新收件箱消息时向应用程序用户发送推送通知,但只有在用户尚未阅读此消息时我才需要发送消息。
所以我是这样看的
- 对于每条发送的消息,我需要在 1 分钟后安排 Laravel 通知
- 如果用户已经收到此消息我需要取消此通知
如何关闭 Laravel 中的预定通知?
Class 扩展通知
public function via($notifiable)
{
if($this->dontSend($notifiable)) {
return [];
}
return ['mail'];
}
public function dontSend($notifiable)
{
return $this->appointment->status === 'cancelled';
}
也许有更方便的处理方式?例如,每次都发送推送,但如果它已经启动,则以某种方式关闭它从应用程序中显示?
一种方法是这样的;
- 在您触发通知之前,请结合
user_id
创建一个唯一标识符(sha1
可能是一个选项)。假设它是SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C
。将其发送到通知。通知和消息会同时发送,但通知会延迟一分钟。
$identifier = Str::random(64);
$delay = now()->addMinute();
$user->notify((new MyNotification($identifier))->delay($delay));
// send a request that contains identifier.
- 你把这个设置为TTL为2分钟的Redis。不行动就没了
Redis::set('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C', 1, 120);
- 在向用户发送消息时,将此标识符附加到消息中。当用户阅读该消息时,您使用所有参数 + 标识符向您的 /read 端点发出请求。
- 收到请求后,从 Redis 中删除密钥。 (用户收到消息)
Redis::del('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C');
- 在你的 Notification class 中,实现一个小方法来检查 Redis 中是否存在键。
Redis::exists('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C');
class MyNotification extends BaseNotification
{
use Queueable;
private $identifier;
public function __construct($identifier)
{
$this->identifier = $identifier;
}
public function via()
{
return $this->isValid() ? ['mail'] : [];
}
public function isValid()
{
return Redis::exists($this->identifier);
}
public function toMail()
{
// details..
}
}
它不一定是 Redis,但它非常适合这种 key/value 结构。