Laravel : 使用 PresenceChannel 广播事件
Laravel : Broadcast event with PresenceChannel
我正在尝试在两个用户共享对话(如聊天)的情况下广播一个事件,其中只有两个用户可以访问并在收到新消息时收到通知。
我认为,在阅读了存在通道是最佳选择的文档之后(私人是一个人的,服务器和通道是公共的而不检查?)
所以在我的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 的 class :
public function broadcastOn()
{
return new PresenceChannel('conversation.'.$this->message->conversation_id);
}
所以我以前使用 PresenceChannel 没有任何检查,所以如果两个人在那里谈话,他们会收到每个人的通知。不对。
在服务器端,我有文档中提到的 'conversation.{conversation}'
来创建一个单独的频道。但我也看到了类似 'conversation.*'
.
的内容
在客户端我有 join('conversation.${conversation.id}')
但在这里我完全不确定我只知道我有道具(道具:['user','friend', 'conversation']) 一个对话,它是一个具有对话 ID 的对象。
所以当每个人都在没有限制的同一个频道上时,一切都运行良好,而现在,我想我有一个错误导致整个事情都无法进行。
我加载客户端对话时出现两个 500 服务器端错误:
ReflectionException in Broadcaster.php line 170:
Class Conversation does not exist
(并且在 route/channels.php 我导入了对话 class use App\Conversation;
)
和
HttpException in Broadcaster.php line 154:
我找到了以下解决问题的方法。我想我在文档中看到一些内容说您可能需要使用要广播的 class 的路径。所以我尝试了这样的事情:
在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)
...
在发出事件的 class 中 MessagePosted
:
public function broadcastOn()
{
return new PresenceChannel('App.Conversation.'.$this->message->conversation_id);
}
我正在尝试在两个用户共享对话(如聊天)的情况下广播一个事件,其中只有两个用户可以访问并在收到新消息时收到通知。
我认为,在阅读了存在通道是最佳选择的文档之后(私人是一个人的,服务器和通道是公共的而不检查?)
所以在我的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 的 class :
public function broadcastOn()
{
return new PresenceChannel('conversation.'.$this->message->conversation_id);
}
所以我以前使用 PresenceChannel 没有任何检查,所以如果两个人在那里谈话,他们会收到每个人的通知。不对。
在服务器端,我有文档中提到的 'conversation.{conversation}'
来创建一个单独的频道。但我也看到了类似 'conversation.*'
.
在客户端我有 join('conversation.${conversation.id}')
但在这里我完全不确定我只知道我有道具(道具:['user','friend', 'conversation']) 一个对话,它是一个具有对话 ID 的对象。
所以当每个人都在没有限制的同一个频道上时,一切都运行良好,而现在,我想我有一个错误导致整个事情都无法进行。
我加载客户端对话时出现两个 500 服务器端错误:
ReflectionException in Broadcaster.php line 170:
Class Conversation does not exist
(并且在 route/channels.php 我导入了对话 class use App\Conversation;
)
和
HttpException in Broadcaster.php line 154:
我找到了以下解决问题的方法。我想我在文档中看到一些内容说您可能需要使用要广播的 class 的路径。所以我尝试了这样的事情:
在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)
...
在发出事件的 class 中 MessagePosted
:
public function broadcastOn()
{
return new PresenceChannel('App.Conversation.'.$this->message->conversation_id);
}