laravel Echo 不监听 channel 和事件

标签 laravel sockets redis laravel-5.3

为了在我使用 laravel Echoredissocket-io 的 channel 上广播一个事件。

这是我的事件:

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


    }

对于 Socket.io 服务器,我使用 laravel-echo-server下面是配置:

{
    "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 并调用事件后,控制台中显示以下日志,显示事件广播到 channel :

[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听不到 channel ,发生了事件。

有什么问题?

最佳答案

我找到了解决方案。

根据 this commentlaravel-echo-server github页面,事件名称需要以点为前缀。像这样:

echo.channel('user-channel.5').listen('.NewMessage', (e) => {
    console.log(e);
});

关于laravel Echo 不监听 channel 和事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43066633/

相关文章:

php - 带有url参数的Laravel post路由

php - 记住不使用 Laravel 的用户

php - 如何使用单个 Laravel 代码实例配置和运行具有各自数据库的多个网站

python - 如何创建始终接收数据的主机套接字。 Python

python-3.x - 如何修复 : ERR Protocol error: expected '$' , 得到 ' '

nosql - Redis 中的命名空间?

php - 404 Not found - 为什么我不能在 laravel 中打开除 "/"之外的任何 View ?

Java客户端服务器发送字节接收器无限期监听

c++ - boost Asio : checking socket ability to be readable/writable

linux - 无法从 Windows 连接到 Redis Linux 服务器