
本文旨在解决laravel数据库通知中频繁发送重复通知的问题。我们将探讨如何通过在通知分发前进行条件判断,实现对短期内同类型通知的聚合与计数更新,从而避免创建新通知,有效提升用户体验。文章将提供详细的实现步骤、代码示例及注意事项。
引言:Laravel通知系统的挑战
在构建现代Web应用时,通知系统是不可或缺的一部分。Laravel提供了强大且灵活的通知功能,支持多种通知渠道,包括数据库通知。然而,在某些场景下,如果短时间内有大量符合条件的事件发生,用户可能会收到大量重复或相似的通知,这不仅会造成用户体验下降,也可能增加数据库负担。例如,当一个用户关注的搜索条件在30分钟内匹配到多篇新文章时,我们可能不希望为每一篇文章都发送一条独立的通知,而是希望将它们聚合成一条通知,并更新其中的计数。
问题分析:toDatabase 方法的局限性
原始代码尝试在 toDatabase 方法内部实现通知的更新逻辑,但存在一个核心问题:
public function toDatabase($notifiable): array{ $count = 1; // 尝试查找并更新现有通知 if ($notification = $notifiable->notifications()->where('data->search', $this->search->id) ->where('updated_at', '>=', now()->subMinutes(30)) ->first()) { $count = isset($notification->data['count']) ? $notification->data['count'] + 1 : 1; $notification->update([ 'data' => [ 'content' => [ 'en' => "{$count} new posts matched with your saved search {$this->search->title} has been posted, Press here to view more.", ], 'count' => $count ] ]); } // 问题所在:此方法始终返回一个数组 return [ 'content' => [ 'en' => "{$count} new post matched with your saved search {$this->search->title} has been posted, Press here to view more.", ], 'count' => $count, 'search' => $this->search->id, 'parameters' => $this->search->parameters ];}
toDatabase 方法的职责是为新通知提供数据。无论方法内部是否执行了更新操作,只要它最终返回一个数组,Laravel的通知系统就会将其视为一条新的通知并存储到数据库中。这意味着即使成功更新了现有通知,该方法返回的数据仍会被用来创建一条新的通知,从而导致重复通知的问题。
要彻底解决这个问题,我们需要将“判断是更新还是创建”的逻辑前置,即在调用 notify() 方法之前完成。
核心策略:在通知分发前进行条件判断
解决此问题的核心策略是:在实际分发通知(调用 $user->notify())之前,先检查是否存在符合条件的近期通知。如果存在,则直接更新该通知;如果不存在,则创建并发送一条新通知。
实现步骤与示例代码
步骤一:简化通知类 toDatabase 方法
首先,我们需要简化通知类中的 toDatabase 方法,使其只负责为新通知提供数据,不再包含更新现有通知的逻辑。通知的计数和内容将通过构造函数传入。
// app/Notifications/NewPostMatchedSearch.phpnamespace AppNotifications;use IlluminateBusQueueable;use IlluminateNotificationsNotification;use IlluminateContractsQueueShouldQueue;use IlluminateNotificationsMessagesDatabaseMessage;use AppModelsSearch; // 假设存在 Search 模型class NewPostMatchedSearch extends Notification{ use Queueable; protected $search; protected $count; // 用于存储当前通知的计数 /** * 创建一个新的通知实例。 * *
以上就是Laravel通知系统优化:实现短期内通知计数更新与新通知抑制的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1338121.html
微信扫一扫
支付宝扫一扫