当前位置: 首页 > 知识库问答 >
问题:

Laravel回声不听频道和事件

南门祯
2023-03-14

为了在频道上播放事件,我使用了laravel Echo、redis和socket io。

这是我的活动:

    class ChatNewMessage implements ShouldBroadcast
    {
        use InteractsWithSockets, SerializesModels;

        public $targetUsers;
        public $message;

        public function __construct ($message)
        {
            $this->targetUsers = $message->chat->users->pluck('user_id');
            $this->message     = $message;
        }

        public function broadcastOn ()
        {
            $userChannels = [];
            foreach ($this->targetUsers as $id) {
                $userChannels[] = 'user-channel.' . $id;
            }
            return $userChannels;

        }

        public function broadcastAs()
        {
            return 'NewMessage';
        }


    }

插座。io服务器我正在使用laravel echo服务器,下面是配置:

{
    "authHost": "http://api.pars-app.dev",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "1924bf1d59b3759d",
            "key": "eaf9e3c843493421f4be488fba11f49d"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": "127.0.0.1",
    "port": "3000",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": ""
} 

这是bootstrap.js文件中的Echo结构:

import Echo from "laravel-echo";
window.echo = new Echo({
    broadcaster: 'socket.io',
    host: 'http://127.0.0.1:3000',
    auth: {
        headers: {
            Authorization: 'bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjUsImlzcyI6Imh0dHA6XC9cL2FwaS5wYXJzLWFwcC5kZXZcL3YxXC9hdXRoXC9zaWduSW4iLCJpYXQiOjE0ODkzMTY1ODgsImV4cCI6MTQ5MTkwNDk4OCwibmJmIjoxNDg5MzE2NTg4LCJqdGkiOiIwNzdiN2NjYjNlODE4MDU2NjBiMWNjYTkzZjI1ZTZmMyJ9.Y_BvVnJIq8k3uN1sQQuBna1CcLsrn7VnpH3RxXS8JEQ'
        }
    }
});
echo.channel('user-channel.5').listen('NewMessage', (e) => {
    console.log(e);
});

运行laravel echo server和call event后,控制台中会显示以下日志,其中显示到频道的事件广播:

[2:26:05 PM] - Xt_VSaSRHirHHxtUAAAE left channel: user-channel.5 (transport close)
[2:26:06 PM] - FwfOFMZqfrI9_H11AAAF joined channel: user-channel.5
Channel: user-channel.2
Event: NewMessage
CHANNEL user-channel.2
Channel: user-channel.1
Event: NewMessage
CHANNEL user-channel.1
Channel: user-channel.5
Event: NewMessage
CHANNEL user-channel.5

但Echo无法收听频道并发生事件。

问题是什么?

共有2个答案

李睿
2023-03-14

当Laravel Horizon展示成功信息时,我已经面临同样的问题好几天了:

[2019-07-18 15:18:50][123] Processing: App\Events\EventClass
[2019-07-18 15:18:50][123] Processed:  App\Events\EventClass

Laravel回声服务器也显示成功消息:

[5:18:27 PM] - xxxxxxxxxx left channel: laravel_database_testChannel (transport close)
[5:18:28 PM] - xxxxxxxxxx joined channel: laravel_database_testChannel
Channel: laravel_database_testChannel
Event: App\Events\EventClass

下面是EventClass中我的broadcastOn()函数的外观:

public function broadcastOn()
{
    return new Channel('testChannel');
}

如您所见,我在testChannel频道中广播了我的事件。但是在某个地方,频道名称的前缀是laravel\u database\

提示因此,要找到要加入的正确频道名称,您应该在Laravel Echo服务器消息中找到它。然后,您将确保使用正确的频道名称。

此外,我加入频道en监听事件没有

Echo.channel('laravel_database_testChannel').listen('EventClass', (e) => {
     console.log(e);
});

这样一切都很好。希望这将节省某人面对同样问题的时间。

郭云
2023-03-14

我找到了解决办法。

根据laravel echo服务器github页面上的这条评论,事件名称需要以点作为前缀。这样地:

echo.channel('user-channel.5').listen('.NewMessage', (e) => {
    console.log(e);
});
 类似资料:
  • 我正在尝试创建一个实时聊天应用程序。我使用了Laravel Echo、Redis和socket io。 但是没有收听私人广播聊天频道。 应用程序事件消息推送

  • 我正在尝试使用专用通道验证laravel echo。每次我收到“无法验证到private-U详细信息。1”。“basket_details”这是通道名称,1是参数。 当我使用公共频道时,一切都很完美。因此,我认为auth部分存在一些问题。 这是我的错误日志 这是我的事件文件。 这是我的频道。php 这是我的js文件 这是我的BroadcastServiceProvider 这是我的laravel

  • Laravel广播的想法很棒,但是很难弄清楚如何让它工作。即使在阅读文档多次,看了许多教程...也许我只是错过了一些小事。谁知道呢? 我在Homestead上的Laravel 5.4项目中运行以下代码: 广播的配置设置为Redis。我安装了Laravel回声服务器,并使用laravel-echo-server start运行此功能,并在控制台中看到类似于[11:15:16 AM]-v7y-5DsM

  • 我使用Laravel成功地安装了WebSocket,并使用了自己的实现。现在我想切换到Laravel Echo和Laravel Echo服务器。但是,经过几个小时的尝试和阅读我能找到的每一份文档后,我确实需要进一步的帮助。 触发事件时发生的情况:队列工作程序根据需要处理事件:“已处理:照亮\广播\广播事件”。但是在laravel echo服务器控制台和客户端上都不会发生任何事情。 一些信息: >

  • 我最近一直在摆弄Laravel Echo和Laravel Echo服务器,Laravel Echo的socket.io服务器实现。 网络上的内容不多,我可能遗漏了一些要点。。 我可以从laravel-echo-server的cli中看到当用户加入或离开一个通道(在我的情况下是存在通道)。我有一个Laravel事件,它执行一些我想在用户离开存在通道时触发的数据库操作。我该如何实现这一点? 谢谢

  • 我来自委内瑞拉,我在尝试将laravel echo与一个项目整合时遇到了一个问题,我尝试了一切,我希望得到你的帮助。 也许我的工作方式不对。 我正在尝试将广播事件与socket io结合使用,因为我在一家初创公司工作,很难像pusher这样支付服务费用。 我想做一个简单的实时聊天。。 那是我的聊天室管理员。。 这种聊天存储在数据库中,根据消息确定群组(chat)。 将触发的事件是: 类sendMe