Laravel通知系统优化:实现短期内通知计数更新与新通知抑制

Laravel通知系统优化:实现短期内通知计数更新与新通知抑制

本文旨在解决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() 方法之前完成。


绘蛙-多图成片

绘蛙-多图成片

绘蛙新推出的AI图生视频工具

绘蛙-多图成片
133


查看详情
绘蛙-多图成片

核心策略:在通知分发前进行条件判断

解决此问题的核心策略是:在实际分发通知(调用 $user-youjiankuohaophpcnnotify())之前,先检查是否存在符合条件的近期通知。如果存在,则直接更新该通知;如果不存在,则创建并发送一条新通知。

实现步骤与示例代码

步骤一:简化通知类 toDatabase 方法

首先,我们需要简化通知类中的 toDatabase 方法,使其只负责为通知提供数据,不再包含更新现有通知的逻辑。通知的计数和内容将通过构造函数传入。

// app/Notifications/NewPostMatchedSearch.php
namespace App/Notifications;

use Illuminate/Bus/Queueable;
use Illuminate/Notifications/Notification;
use Illuminate/Contracts/Queue/ShouldQueue;
use Illuminate/Notifications/Messages/DatabaseMessage;
use App/Models/Search; // 假设存在 Search 模型

class NewPostMatchedSearch extends Notification
{
    use Queueable;

    protected $search;
    protected $count; // 用于存储当前通知的计数

    /**
     * 创建一个新的通知实例。
     *
     *
登录后复制

以上就是Laravel通知系统优化:实现短期内通知计数更新与新通知抑制的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1765511.html

发表回复

Your email address will not be published. Required fields are marked *