在 Laravel 中广播的想法很棒,但很难弄清楚如何让它发挥作用。即使在多次阅读文档,观看了许多教程之后.. 可能我只是错过了一些小事。谁知道呢?
我在 Homestead 上的 Laravel 5.4 项目中运行以下代码:
# Event
class NewNumber implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $number;
public function __construct($number)
{
$this->number = $number;
}
public function broadcastOn()
{
return new Channel('pub-channel');
}
}
# EventServiceProvider:
protected $listen = [
'App\Events\NewNumber' => [
'App\Listeners\DoSomeThingsWithNewNumber',
],
];
广播的配置设置为 Redis。我安装了Laravel Echo Server
并运行它laravel-echo-server start
并在控制台中查看类似的内容[11:15:16 AM] - v7y-5DsMXHdBXcqzAAAA joined channel: pub-bingo
它创建的以下配置:
{
"authHost": "http://localhost",
"authEndpoint": "/broadcasting/auth",
"clients": [],
"database": "redis",
"databaseConfig": {
"redis": {},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": true,
"host": null,
"port": "6001",
"protocol": "http",
"socketio": {},
"sslCertPath": "",
"sslKeyPath": ""
}
在javascript中,我添加了:
import Echo from "laravel-echo";
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});
console.info(window.Echo.channel('pub-channel'));
window.Echo.channel('pub-channel')
.listen('NewNumber', (e) => {
console.info(e);
alert('Something happened');
console.log(e.number);
});
Chrome 中的控制台显示 .info 以及有关频道的信息。据我所知,一切看起来都很好。
但是什么没有发生,我的警报和监听方法中的 console.loggin。
我有一个在不同浏览器中触发的 URL,其中包含以下内容:
broadcast(new \App\Events\NewNumber(rand(1, 100));
当我触发该 url 时,应用程序在 Laravel 日志中记录了一些成功完成的内容:
[2017-04-30 11:38:44] local.INFO: Broadcasting [App\Events\NewNumber] on channels [pub-channel] with payload:
{
"number": 54,
"socket": null
}
而且我也php artisan queue:listen
正在运行(QUEUE_DRIVER:数据库)。但是数据库保持空..
我真的无法弄清楚我错过了什么.. 错过了什么?!...