簡體   English   中英

laravel Echo不聽頻道和事件

[英]laravel Echo does not listen to channel and events

為了在頻道上播放事件,我使用了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和call事件后,下面的日志顯示在控制台中,顯示事件廣播到頻道:

[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無法聽取頻道和發生的事件。

有什么問題?

我找到了解決方案。

根據laravel-echo-server github頁面上的這條評論 ,事件名稱需要以點為前綴。 像這樣 :

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

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消息中找到它。 然后,您將確保使用正確的頻道名稱。

此外,我加入了頻道en沒有聽的事件. 簽名如下:

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

這一切都很好。 希望這會在遇到同樣的問題時節省一些人的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM