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);
}