我想在一个网站上实现一个非常简单的聊天,在2个注册用户和登录用户之间添加私有(private)消息(甚至可能在登录用户之间发送群组消息)。
以Whatsup为例,但是我当然不会有那么多用户。
资源:Symfony2 + WebsocketBundle
https://github.com/GeniusesOfSymfony/WebSocketBundle
两个问题:
1-您会建议哪种数据库架构?
2-我将如何管理“主题”? (阅读完WebsocketBundle教程后,我了解了如何订阅/取消订阅/广播到某个主题。但是我不知道如何管理用户和主题之间的关系,如何保护对话等。
我只需要一些有关应用程序逻辑的信息(无代码)……要保存什么信息以及保存在何处。)
例如,如何管理 channel 的名称( channel 名称是否会每次更改,还是将其存储在数据库中,并在用户下次登录时以某种方式重新使用)?
session.subscribe("acme/channel/id/12345", function(uri, payload){
console.log("Received message", payload.msg);
});
P.s.我已经尝试在SO和Google上进行搜索,但是找不到任何有用的信息。
最佳答案
WebsocketBundle
只为您提供一种减少编写套接字通信量的机制。对于聊天/群聊设置,您有很多选择。第一种选择是使用某些消息传递捆绑包,并根据需要对其进行修改。我发现此捆绑包(https://github.com/FriendsOfSymfony/FOSMessageBundle)非常灵活。
但是,如果您要开发自己的模板,那么这里的模板是FOSMessageBundle的模板所启发的,并进行了一些自定义。附加一个带有表的架构及其列名。可以轻松地从中识别主键和外键。
除了Thread
表中的一个字段thread_group_hash
之外,其余所有内容都非常简单。实际上,该字段的目的是每个线程的唯一哈希/键。线程意味着一对一聊天或多对多聊天。无论何时有人将人们添加到聊天中,用户都将IDs
与他们相关联。我以升序或降序对添加的用户ID进行排序,并生成md5/sha1 key 并将其存储在此处。
这也可以用作topic
中的WebSocketBundle
,因为这是为了达到我们在此处试图实现的相同目的而使用的topic
。每当来自任何一方的同一个人添加到对话中时,通信将进入同一线程。但是请记住,在插入线程/消息详细信息之前,您需要使用此哈希标识它所属的位置或它是一个新线程:)