[学习笔记] 消息通知流程梳理

  1. 当我进行对一个帖子回复评论的时候,经过路由到达reply评论控制器下的store方法,这个方法接收数据进行保存。
  2. 保存完成后,事件观察器启动created方法启动,这个观察器接收一个参数,是用户提交的评论实例。
  3. 这里我们要对模型关联梳理下,用户关联了帖子, 用户关联了评论, 帖子关联了评论,所以我们可以通过实例调用关联模型的方法。
  4. 在评论观察器里面,我们用评论实例-调用进行评论的用户的实例-的notify方法,这个方法是user模型引入了Notifiable这个trait的方法,它实现了消息推送,就是它拿到数据,然后推送给帖子所有者。
  5. 这个notify是如何拿到推送给帖子所有者的数据的?
  6. 它的参数为实例化通知类( TopicReplies ),实例化这个类的时候带入了参数,为实例化的评论。
  7. 这时候我们要进入通知类去看看是怎么通过这个评论实例( $reply ),得到推送给帖子所有的实例。
    8.这个类里面先定义一个属性为replies,把传递过来的$reply赋值给这个属性。
    9.这个类里面有两个方法,第一个via方法决定了推送消息的形式,以return的形式决定,这里我们使用数据库database
    10.第二个方法为toDatabase,我贴上官方文档的说明:要让一个通知支持被存储到数据库表中,你需要为通知类定义方法 toDatabase 。这个方法应当接受一个 $notifiable 的实体作为参数,并且可以返回一个普通的 PHP 数组。被返回的数组将被编码为 JSON 并存储在你的 notifications 表的 data 数据列。
    11.这里我们去看下教程里面的代码。
    12.通过评论模型和帖子模型关联,用传递过来的评论实例得到,评论对应的帖子实例。第二,使用帖子模型的link方法获取到帖子的路由。
    13.第三return了要推送给帖子所有者的信息,这些信息不介绍,就是评论实例化、它对应的帖子实例化、他对应的用户实例化的一些属性。看前面写的官方介绍。
    14.这里return的数据进行了两次处理,第一个以json形式为存储到notifications表的data字段里。第二,这个return 把数据返回给了调用了这个类的,事件观察器的帖子实例。
    15.到这里就完成了推送。

再次说明步骤:填写评论,提交,保存到数据库,观察器启动,调用通知类获取通知信息,获取到后推送给用户。

这里要说的第二点是notify这个方法:我们再观察器调用了notify方法推送消息,但我们再User模型中改变了这个方法,实际的推送步骤是:
1.获取到推送给帖子所有者的信息后,进入到User模型的notify方法中,进行判断,是不是自己给自己的帖子评论,是的就不推送。不是的化就进行当前帖子用户的notification_count字段值+1,表示未读消息+1条。
2.然后使用laravelNotify方法推送消息。这里就有疑点了,不是说使用notify方法推送吗,怎么方法名还变了。
3.看前面的use Notifiable中,我们对notify方法重命名了,也就是推送消息的方法时候是laravelNotify执行,而原本的notify方法改变为判断加推送消息。它本身不具有推送消息的能力了,实现推送的是它体内的laravelNotify方法。

关于查看后去除通知数:看下官方文档,很简单:消息通知《Laravel 5.6 中文文档》 查看这里面的 通知标为已读 这一段落。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
followyounger

很棒啊

5年前 评论
UKNOW

我在想这个过程是不是搞的繁琐了,如果现在不是用laravel框架,那么我的处理方式就是 评论一个文章时,给文章作者的的通知数字段加1,然后将评论内容存入表或者redis队列,来推送给用户。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!