laravel echo 不监听通道和事件
laravel Echo does not listen to channel and events
要在频道上广播事件,我使用了 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';
}
}
对于 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 无法收听频道并发生事件。
有什么问题?
我找到了解决方案。
根据this comment on laravel-echo-server github页面,事件名称需要以点为前缀。像这样:
echo.channel('user-channel.5').listen('.NewMessage', (e) => {
console.log(e);
});
几天来我一直面临同样的问题,而 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 Echo 服务器也显示成功消息:
[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 、 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';
}
}
对于 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 无法收听频道并发生事件。
有什么问题?
我找到了解决方案。
根据this comment on laravel-echo-server github页面,事件名称需要以点为前缀。像这样:
echo.channel('user-channel.5').listen('.NewMessage', (e) => {
console.log(e);
});
几天来我一直面临同样的问题,而 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 Echo 服务器也显示成功消息:
[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);
});
这样一切都很好。希望这会在遇到同样问题时节省某人的时间。