2016-03-05 97 views
2

我想在Yii2中实现简单的通知系统。 我有一个ListView中填充的记录列表。 我想让用户为这个记录投票。每个记录只有一次。 此外,每个记录的作者都必须得到通知(如新的电子邮件一样)关于谁投票支持他的记录。 在Yii2中实现这个最简单的方法是什么? 感谢您的建议!Yii2通知系统执行

+0

最简单的方法是使用事件。 http://www.yiiframework.com/doc-2.0/guide-concept-events.html – SiZE

+0

感谢您的链接。据我所知,通过事件我可以获取和处理来自用户的数据(我也可以使用控制器/操作),但是如何通知用户他获得了新消息(数据库中有新记录)?有没有可以触发服务器推送的事件?或者我可以找到关于它如何工作的简单解释或例子? – Dmytro

+0

你知道如何使用JS事件,比如onclick等吗?这是一样的。您注册事件,注册事件处理程序,触发该事件并在处理程序中处理您自己的逻辑。这可能就像发送电子邮件,更新数据库,任何你想要的东西。 – SiZE

回答

1

使用php只有你不能这样做,你需要有一些点js。

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

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

所以来这里的解决方案二:yii2 + redis + nodejs + socket

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

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

+0

谢谢你的链接。这非常有用。但是,我可以通过哪种方式获得新连接客户端的ID?过滤邮件的最佳做法是什么(例如,如果我需要向特定用户发送邮件)?我应该为它创建一个新频道吗?或者,我应该在套接字中创建过滤器(notification.js,如上所述)?我可以发布到一个频道的发件人和目标用户的ID,但如何获得用户($ thismodel-> ID)在套接字js代码中以检查当前用户是否是真正的目标? – Dmytro

+0

你可以在这个''io.on('connection',function(socket){'''socket.id'')里面获得套接字ID,它会给你你应该以某种方式存储它的ID,然后当发送消息给用户而不是'socket.emit'使用**'io.sockets.to(socketId).emit' **其中** socketId **是特定用户的套接字ID – leninhasda