[学习笔记] 消息通知流程梳理
- 当我进行对一个帖子回复评论的时候,经过路由到达 reply 评论控制器下的 store 方法,这个方法接收数据进行保存。
- 保存完成后,事件观察器启动 created 方法启动,这个观察器接收一个参数,是用户提交的评论实例。
- 这里我们要对模型关联梳理下,用户关联了帖子, 用户关联了评论, 帖子关联了评论,所以我们可以通过实例调用关联模型的方法。
- 在评论观察器里面,我们用评论实例 - 调用进行评论的用户的实例 - 的 notify 方法,这个方法是 user 模型引入了 Notifiable 这个 trait 的方法,它实现了消息推送,就是它拿到数据,然后推送给帖子所有者。
- 这个 notify 是如何拿到推送给帖子所有者的数据的?
- 它的参数为实例化通知类 (TopicReplies),实例化这个类的时候带入了参数,为实例化的评论。
- 这时候我们要进入通知类去看看是怎么通过这个评论实例 ($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 中文文档》 查看这里面的 通知标为已读 这一段落。
推荐文章: