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

  • 转载
  • 发布时间: 1个月前
  • 收藏数: 1 / 点赞数: 0 / 阅读数: 24
  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 方法。
评论
用户评论
  • 董俊俊
    董俊俊 1个月前 评论了文章: [学习笔记] Laravel消息通知流程梳理
    我在想这个过程是不是搞的繁琐了,如果现在不是用 laravel 框架,那么我的处理方式就是 评论一个文章时,给文章作者的的通知数字段加 1,然后将评论内容存入表或者 redis 队列,来推送给用户。