【问题标题】:Yii2 notification system implementationYii2通知系统实现
【发布时间】:2016-06-19 09:42:03
【问题描述】:

我正在尝试在 Yii2 中实现简单的通知系统。 我在 ListView 中填充了一个记录列表。 我想允许用户投票支持此记录。每条记录仅一次。 此外,必须通知每条记录的作者(就像新收到的电子邮件一样)谁为他的记录投票。 在 Yii2 中实现这一点的最简单方法是什么? 感谢您的建议!

【问题讨论】:

  • 最简单的方法是使用事件。 yiiframework.com/doc-2.0/guide-concept-events.html
  • 感谢您的链接。据我了解,通过事件,我可以获取和处理来自用户的数据(我也可以使用控制器/动作来完成),但是如何通知用户他收到了新消息(数据库中的新记录)?是否有可以触发服务器推送的事件?或者我在哪里可以找到有关其工作原理的简单说明或示例?
  • 你知道如何使用JS事件,比如onclick等吗?这是一样的。您注册事件,注册事件处理程序,触发该事件并在处理程序中处理您自己的逻辑。这可能就像发送电子邮件,更新数据库,任何你想要的。
  • 正在编辑..)按回车
  • 想象以下情况。 “用户 A”单击了一个按钮,“用户 B”获得了“已单击”消息。因此,逻辑应如下所示: - 在“用户 A”单击按钮后触发事件。事件处理程序将向 DB 插入一行。 (这很清楚) - 生成一个事件来通知“用户 B”。 (这我仍然无法理解。如何在不采取任何行动的情况下将数据发送给“用户 B”。或者“用户 B”还应该使用 Pjax 作为 esample 定期检查 DB?)例如附加到按钮和该按钮的控制器/动作的事件之间有什么区别?

标签: email yii2 chat message vote


【解决方案1】:

只有php你不能做到这一点,你需要在某些时候拥有js。

解决方案一可能是,从用户 B 端,您在一定时间后(使用 ajax)不断询问服务器是否发生了任何(事件)。如果它确实使用该 ajax 返回结果并更新页面。 但话说回来,这不是一个很好的做法。

如果您真的想要实时更新,您可能需要使用socket.io。然后再次使用 php socket 是一个坏主意。

所以解决方案二来了:yii2 + redis + nodejs + socket

redis 会做 yii2 和 nodejs 之间的通信。这个想法是,如果发生任何事情(事件或更新),yii2 将 发布 一个 event 与关联 data 到 redis channel 并且正在监听该频道的 nodejs 将捕获该事件并发送使用套接字将数据(或更新)发送给客户端。

Here is a real time chat application tutorial using yii2+redis+nodejs+socket.

【讨论】:

  • 感谢您的链接。这是非常有用的。但是我可以通过哪种方式获得新连接客户端的 ID?过滤消息的最佳做法是什么(例如,如果我需要向一个特定用户发送消息)?我应该为它创建一个新频道吗?或者我应该在套接字内创建过滤器(根据提到的例子,notification.js)?我可以将发送者和目标用户的 ID 发布到频道,但是如何在套接字 js 代码中获取用户($thismodel->ID)以检查当前用户是否是真正的目标?
  • 您可以在此io.on('connection', function (socket) { 中获取套接字 ID socket.id 将为您提供您应该以某种方式存储它的 ID,然后当向用户发送消息而不是 socket.emit 使用io.sockets.to(socketId).emit 其中 socketId 是特定用户的套接字 ID
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
相关资源
最近更新 更多