我正在尝试在两个用户分享对话(如聊天)的情况下广播一个事件,其中只有两个用户可以访问并在收到新消息时收到通知。
我认为,在阅读文档后,状态通道是最佳选择(私人是一个人,服务器和渠道是没有检查的东西;)
所以在我的routes/channels.php
我有类似的东西:
Broadcast::channel('conversation.{conversation}', function ($user, Conversation $conversation) {
if ($user->id === $conversation->user1_id || $user->id === $conversation->user2_id) {
return $user;
}
return null;
});
在客户端,我有一个组件:
Echo
.join('conversation.${conversation.id}')
.here((users) => {
this.usersInRoom = users;
})
.joining((user) => {
this.usersInRoom.push(user);
})
.leaving((user) => {
this.usersInRoom = this.usersInRoom.filter(u => u != user);
})
.listen('MessagePosted', (e) => {
this.messages.push({
id :e.message.id,
user_id :e.message.user_id,
conversation_id :e.message.conversation_id,
user :e.user,
text :e.message.text,
created_at :e.message.created_at,
updated_at :e.message.updated_at,
});
});
发出偶数MessagePosted的类:
public function broadcastOn()
{
return new PresenceChannel('conversation.'.$this->message->conversation_id);
}
所以我现在以前使用PresenceChannel而没有任何检查,所以如果两个人在那里进行对话,他们会得到所有人的通知。不是正确的事。
在服务器端,我有文档中提到的'conversation.{conversation}'
来创建一个单独的通道。但我也看到了类似'conversation.*'
的内容。
在客户端,我有join('conversation.${conversation.id}')
,但在这里我完全不确定我是否知道我有道具(道具:['用户','朋友','对话'))会话,这是一个具有会话ID的对象。
那么,当每个人都在同一个频道上而没有任何限制时,一切都工作得很好而现在,我认为我有一个错误,使整个事情无法正常工作。
加载客户端对话时,我遇到两个500服务器端错误:
ReflectionException in Broadcaster.php line 170:
Class Conversation does not exist
(在路由/ channels.php中我导入了对话类use App\Conversation;
)
和
HttpException in Broadcaster.php line 154:
答案 0 :(得分:0)
我找到了以下解决方案来解决我的问题。我想我在文档中看到了一些内容,说您可能需要使用要广播的类的路径。所以我试过这样的事情:
在routes/channel.php
Broadcast::channel('App.Conversation.{id}', function ($user, $id) {
$conversation = Conversation::findOrFail($id);
if ($user->id === $conversation->user1_id || $user->id === $conversation->user2_id) {
return $user;
}
return null;
});
在vue组件的客户端:
Echo
.join('App.Conversation.'+this.conversation.id)
...
在发出事件MessagePosted
的类中:
public function broadcastOn()
{
return new PresenceChannel('App.Conversation.'.$this->message->conversation_id);
}