Laravel 没有广播拉威尔事件

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收听事件的广播频道

我希望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,