在 laravel 中将中间件添加到推送器通道

Add middleware to pusher channel in laravel

所以我在 laravel 中使用推送器实现了一点聊天功能,因此它可以实时更新。每当发送消息时,我都会使用以下方法调用 broadcast(new MessageSent($message, $conversationId)); 的事件。

public function broadcastOn()
{
    return ['chat-' . $this->conversationId];
}

public function broadcastAs()
{
    return 'new-message';
} 

还有一段 js 将它推送到我的前端,这样调用

var channel = pusher.subscribe('chat-' + {{ $conversation->id }});

channel.bind('new-message', function(data) {
    console.log(JSON.stringify(data));
    pushForeignMessage(data.message);
});

它按预期工作,但我不知道如何做到这一点,以便不是每个人都能只收听聊天号码并查看发送的每条新消息。我已经为它准备了一些中间件,但我不知道如何制作它,以便您只能收听特定频道(如果适用)。

好的,所以我为此使用了 laravel Echo,这使它变得更简单,因此您不必编写自己的身份验证入口点。

我也只是 return 根据模型中检查我需要的一切的某些方法判断真假。

Broadcast::channel('private-chat-{conversationId}', function ($user, $conversationId) {
    if(!Model::HasAccess){
        return false;
    }
    return true;
});

并确保您 return 在您的活动中使用私人频道。

    public function broadcastOn()
    {
        return new PrivateChannel('private-chat-' . $this->conversationId);
    }

    public function broadcastAs()
    {
        return 'new.message';
    }

Echo 代码如下所示。 https://laravel.com/docs/8.x/broadcasting#client-pusher-channels 快速设置。

Echo.private('private-chat-{{ $conversation->id }}')
            .listen('.new.message', (e) => {
                pushForeignMessage(e.message);
            }).error(error => {
                console.error('Could not subscribe to chat: ' + error.error)
                window.errorMessage('Kon niet verbinden met de chat. U kan geen realtime berichten ontvangen.', 'danger')
            });

我觉得这有点脏,但它可以工作并且可以满足我的需要。如果有人知道更好/更容易或 'the laravel way' 这样做,请告诉我。