总结要点:消息通知系统

maogu5个月前Laravel70

消息通知系统

  • 用于向用户发送消息提醒

  • 途径:

    • 数据库

    • 邮件

    • 短信

    • Slack

使用

准备数据库

  • 消息通知系统会在一张数据表中存储所有的通知消息

    • 包含通知类型,描述通知的其他信息

# 创建表
php artisan notifications:table

# 数据库迁移
php artisan migrate

创建通知类

  • Laravel 中,一种通知就是一个类,文件一般放在 app/Notifications 中

  • 可以通过 artisan 命令来创建

php artisan make:notification TopicReplied
  • 在通知类的构造方法中,注入需要的模型

  • 每个通知类都会有 via 方法,用来指明通知的方式

return ['database']; or return ['mail'];

针对不同的通知类型,需要实现不同的方法 toXXX($notifiable)

  • 方法接收 $notifiabel 作为参数

  • 方法返回一个数组,该数组之后会转换成 JSON 数据存放在通知数据表的 data 中

如果 via 数据库进行通知,那么 toXXX 就是 toDatabase
如果 via 邮件进行通知,那么 toXXX 就是 toMail

 public function toDatabase($notifiable)
    { 
        // 存入数据库里的数据 data table
        return [
            'reply_id' => $this->reply->id,
            'reply_content' => $this->reply->content,
            'user_id' => $this->reply->user->id,
            'user_name' => $this->reply->user->name,
            'topic_id' => $topic->id,
            'topic_title' => $topic->title,
        ];
    }


触发通知

  • 调用 User 中的 notify 方法,并新建一个通知实例作为参数传入

  • 也可以通过重写 User 类的 notify 方法来实现更多的操作,但最后需要调用 Notifiable.notify 方法来发送通知

 <?php
use App\Notifications\TopicReplied;

class ReplyObserver
{
    public function created(Reply $reply)
    {
        $reply->topic->reply_count = $reply->topic->replies->count();
        $reply->topic->save();

        // 通知话题作者有新
        $reply->$topic->user->topicNotify(new TopicReplied($reply));
    }
}

修改User模型

public function topicNotify($instance)
{
    // 如果要通知的人是当前用户,就不必通知了!
    if ($this->id == Auth::id()) {
        return;
    }
     // 只有数据库类型通知才需提醒,直接发送 Email 或者其他的都 Pass
        if (method_exists($instance, 'toDatabase')) {
            $this->increment('notification_count');
        }
    $this->notify($instance);
}

//用户查看后自动清零
  public function markAsRead()
    {
        $this->notification_count = 0;
        $this->save();
        $this->unreadNotifications->markAsRead();
    }

修改控制器的 index() 方法,新增清空未读提醒的状态:

public function index()
    {
        // 获取登录用户的所有通知
        $notifications = Auth::user()->notifications()->paginate(20);
        // 标记为已读,未读数量清零
        Auth::user()->markAsRead();
        return view('notifications.index', compact('notifications'));
    }

测试「重新发送邮件」和「消息通知」的功能,成功!


相关文章

上一节下一节

$data['images'] = $chapter->images()->get(); $data['comic'] = $chapter->co...

Laravel Observer 维护客户积分 必须使用DB!

public function created(Activation $activation)     {  &nb...

Simditor便捷的所见即所得编辑器

Simditor便捷的所见即所得编辑器

将以下文件导入您的Web应用程序<link rel="stylesheet" type="text/css" href=&q...

php时间差计算

   $one = strtotime($attendance->created_at);     &...

微信开发者账户申请以及测试

微信公众平台测试账号申请公众平台测试账号十分方便,直接通过微信登录即可,登录地址登录后我们可以看到 appId 和 appsecret我们需要关注自己的测试公众号,只有关...

Laravel 7使用Http Client同步api数据到数据库-定时任务

测试Api 来自https://api.qq.jsososo.com/ 是个开源项目安装httpcomposer require guzzlehttp/guzzlephp...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。