Laravel:使用PresenceChannel进行广播活动

时间:2017-05-09 10:20:06

标签: laravel events laravel-5.4 broadcast pusher

我正在尝试在两个用户分享对话(如聊天)的情况下广播一个事件,其中只有两个用户可以访问并在收到新消息时收到通知。

我认为,在阅读文档后,状态通道是最佳选择(私人是一个人,服务器和渠道是没有检查的东西;)

所以在我的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:

1 个答案:

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