Laravel 没有广播拉威尔事件
我正在为应用程序开发聊天/消息功能。当用户发送消息时,我希望触发并广播特定事件。然后,我希望Laravel Echo使用Laravel 没有广播拉威尔事件,laravel,events,vue.js,laravel-echo,Laravel,Events,Vue.js,Laravel Echo,我正在为应用程序开发聊天/消息功能。当用户发送消息时,我希望触发并广播特定事件。然后,我希望Laravel Echo使用推送器驱动程序,通过Laravel Echo收听事件的广播频道 我希望Laravel Echo实现位于Vue组件中,并检索通过事件广播的数据。目前,我无法将事件广播到私人频道或仅广播一个频道 以下是我所做的: 1) 将配置添加到.env 2) 将配置添加到bootstrap.js: window.Echo = new Echo({ broadcaster: 'pusher'
推送器驱动程序,通过Laravel Echo收听事件的广播频道
我希望Laravel Echo实现位于Vue组件中,并检索通过事件广播的数据。目前,我无法将事件广播到私人频道或仅广播一个频道
以下是我所做的:
1) 将配置添加到.env
2) 将配置添加到bootstrap.js
:
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'mykey',
encypted: false
});
3) 添加了身份验证签入App\Providers\BroadcastServiceProvider
(如果用户现在已登录,则返回true):
4) 将App\Providers\BroadcastServiceProvider::class,
添加到App/config/App.php
5) 创建了事件App\Events\UserSentMessage
,该事件在名为chat
的私有频道上广播。我还试着向频道
广播。我检查了,该事件是从对控制器中的event()
helper的调用中触发的,它似乎没有被广播。我还尝试在上述控制器中使用广播
方法
6) 在有效的Vue组件中安装的Vue生命周期挂钩中添加了以下内容(组件正在按预期呈现数据等,只是不使用Laravel Echo atm):
还尝试:
Echo.channel('chat').listen('UserSentMessage', (data) => {
console.log(data);
}, (e) => {
console.log(e);
});
Vue组件正在成功订阅指定的频道。pusher调试控制台识别出它正在被订阅,但触发的事件从未被广播
似乎广播这一事件有问题。我还尝试使用broadcast()
帮助程序,而不是event()
帮助程序
另外,当通过Echo.private()
使用Laravel Echo订阅事件时。它似乎在频道名称前加了private
,因此我也尝试了(在这种情况下)向名为private chat
的频道广播。我建议您检查.env
文件
,并确保广播驱动程序不是日志(尝试推送程序)
而且不要忘记继续运行队列侦听器:
php artisan queue:listen
UPD.:如果您正在寻找更高级的解决方案,请阅读有关事件不会立即广播,它将发送到队列,只有在您侦听或处理队列时,事件才会被使用。如果要立即执行作业,请设置QUEUE_DRIVER=sync。看:@materliu:这是一个很好的暗示。在我的例子中,我没有创建一个将工作目录设置为我正在处理的项目的队列。使用马戏团。事件已在代码中触发,但没有可用的作业侦听器。当我运行“php artisan queue:listen”时,所有以前的广播都被处理了
通常很难找出复杂系统的哪个组件不起作用。我对Num8er的回答投了赞成票,但我也发现了一些其他问题,或许它们也能帮助你
1) 删除频道名称开头的所有“private-”。这些由各种库(例如socket.io/laravelecho)在后台处理。如果查看任何调试输出,您将看到在通道名称前面加上“private-”,但不需要添加这些名称
2) 如果您使用的是redis,请确保在.env文件中将redis_前缀设置为空字符串。默认情况下,它设置为类似“laravel_数据库”的内容,这会弄乱频道名称
REDIS_PREFIX=
3) 确保您的laravel echo服务器正在运行(以及redis/pusher)。您还需要确保队列工作程序正在运行:
php artisan queue:work
4) 在Echo服务器上启用调试输出是值得的,因为这将告诉您有关通信量的有用信息(例如频道名称),因此请修改laravel-Echo-Server.json文件(在项目根目录中),以便将devMode设置为true:
"devMode": true,
在我的例子中,我的事件类文件是由“make:event”生成的,它确实有broadcastOn
方法。。。但是没有实现ShouldBroadcast
~
它导致laravel echo服务器不输出任何内容~
Laravel Framework 8.13.0完美!非常感谢你!非常感谢你。经过近4个小时的调试。你节省了我的时间。在拉了我几个小时的头发后,你节省了我一天的时间。我没有意识到这一切都在排队。谢谢@num8er从2020年开始感谢您!你是个圣人!
php artisan queue:work
"devMode": true,