laravel Echo 不监听频道和事件

Posted

技术标签:

【中文标题】laravel Echo 不监听频道和事件【英文标题】:laravel Echo does not listen to channel and events 【发布时间】:2017-08-21 08:30:36 【问题描述】:

为了在频道上广播事件,我使用了 laravel Echoredissocket-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';
        


    

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

[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 无法收听频道并发生事件。

什么问题?

【问题讨论】:

【参考方案1】:

我找到了解决办法。

根据laravel-echo-servergithub页面上的this comment,事件名称需要以点为前缀。像这样:

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

【讨论】:

在活动中使用broadcastAs 时需要点。 @dev02 事件类名和监听通道名不一样,你说的可能就是这种情况。【参考方案2】:

当 Laravel Horizo​​n 显示成功消息时,我已经面临同样的问题好几天了:

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

并且 Laravel Echo Server 也显示成功消息:

[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_database_ 为前缀。

提示!因此,要找出加入的正确频道名称,您应该在 Laravel Echo Server 消息中找到它。这样您就可以确保使用正确的频道名称。

此外,我加入频道并收听没有.标志的事件如下:

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

以这种方式一切正常。希望这会在遇到同样问题时节省一些人的时间。

【讨论】:

以上是关于laravel Echo 不监听频道和事件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Echo 监听器没有在听

无法使用 Laravel echo server、redis 和 socket.io 验证 laravel 私人频道

带有私有通道的 Laravel Echo SocketIO

Laravel Echo 私人频道不听

Laravel Echo - 允许访客连接到出席频道

Laravel Echo 重复监听事件 n 次广播已被制作