【问题标题】:Symfony 5 Private chat with PusherSymfony 5 与 Pusher 的私人聊天
【发布时间】:2021-11-15 03:18:44
【问题描述】:

我已经用Symfony 5 创建了一个简单的群聊应用程序,现在我正在尝试用Pusher 添加Socket

目前它正在工作,但由于我使用的是单个 channel,因此每次用户发布消息时,此消息都会出现在每个对话中。这就是为什么我想在channel name 中传递messaging_id,但它不起作用。

我在文档上读到我应该在我的channel name 中使用前缀private-,但是控制台要求我对用户进行身份验证,我不知道该怎么做,因为我的用户已经连接.

这是我的逻辑控制器

 // Pusher
        $options = array(
            'cluster' => 'eu',
            'useTLS' => true
        );
        $pusher = new Pusher(
            'ba75523bee28d7c644f2',
            '9597b6daf0fb4e20fda2',
            '1266737',
            $options
        );

        //New message
        $message = new Message();
        $form = $this->createForm(MessageType::class, $message);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $message->setAuthor($user);
            $message->setMessaging($messaging);
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($message);
            $entityManager->flush();

            $data = $message->getContent();

            if ($pusher->trigger('my-channel', 'my_event', $data)) {
                echo 'success';
            } else {
                header('', true, 403);
                echo 'error';
            }

            return new JsonResponse(Response::HTTP_OK);
        }

这是我的 Javascript

Pusher.logToConsole = true;

var pusher = new Pusher('ba75523bee28d7c644f2', {
    cluster: 'eu',
});

var channel = pusher.subscribe('my-channel');

channel.bind('my_event',
    function (data) {
        console.log(data);
        $('.lala').append('<li class = "chat-left"><div class="chat-text">' + data + '</div>');
    });

channel.bind('pusher:subscription_succeeded', function (members) {
    console.log('successfully subscribed!');
});

function ajaxCall(ajax_url, ajax_data) {
    $.ajax({
        type: "POST",
        url: ajax_url,
        dataType: "json",
        data: ajax_data,
        success: function (response) {
            console.log(response);
        },
        error: function (msg) { }
    });
}

如果我使用 private- 前缀,则会出现以下错误: enter image description here

总而言之,我希望每条消息只出现在好的对话中(消息当然保存在正确对话的数据库中)。 感谢您的帮助!

【问题讨论】:

    标签: javascript symfony sockets chat pusher


    【解决方案1】:

    您没有必须使用私人频道来为每个聊天设置一个频道,但这确实有意义 - 这将允许您确保唯一属于聊天成员的用户能够订阅频道(并因此接收消息)。

    收到的错误消息似乎表明您的身份验证端点的代码有错误。您可以在https://pusher.com/docs/channels/server_api/authenticating-users/ 找到身份验证过程的详细信息和身份验证端点代码示例。

    如果您使用的是 PHP 库,那么生成身份验证令牌所需的代码将在 in the Github repo 中详细说明。这将需要返回以响应身份验证请求

    【讨论】:

    • 我找到了一个解决方案,只需在通道名称触发器中直接使用消息传递->getId(),在 javascript 代码中也是如此,它正在工作,也许不是最好的解决方案,但目前它是工作
    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2018-11-29
    相关资源
    最近更新 更多