我正在处理应用的聊天/消息功能。当用户发送消息时,我希望触发并广播特定事件。我当时希望Laravel Echo使用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):
Broadcast::channel('chat', function ($user) {
// verify that user is recipient of message
return \Auth::check();
});
4)将App\Providers\BroadcastServiceProvider::class,
添加到App/config/app.php
。
5)创建了活动App\Events\UserSentMessage
,该活动在名为PrivateChannel
的{{1}}上进行广播。我也尝试过播放chat
。我查了一下,事件是在控制器中调用Channel
助手时被触发的,它似乎没有被广播。我也尝试在提到的控制器中使用event()
方法。
6)在有效Vue组件的broadcast
Vue生命周期钩子中添加了以下内容(组件按预期呈现数据等,只是不与Laravel Echo atm一起使用):
mounted
还尝试过:
Echo.private('chat').listen('UserSentMessage', (data) => {
console.log(data);
}, (e) => {
console.log(e);
});
Vue组件成功订阅指定的频道。推送器调试控制台识别出它正在订阅,但触发后的事件永远不会被广播。
似乎广播事件存在问题。我也尝试使用 Echo.channel('chat').listen('UserSentMessage', (data) => {
console.log(data);
}, (e) => {
console.log(e);
});
帮助程序,而不是broadcast()
帮助程序。
此外,通过event()
使用Laravel Echo订阅活动时。它似乎在频道名称前加上Echo.private()
,因此我也尝试将广播(在事件中)广播到名为private
的频道。
答案 0 :(得分:7)
我只能建议您检查.env
文件,并确保BROADCAST_DRIVER
不是log
(尝试pusher
)
不要忘记继续运行队列监听器:
php artisan queue:listen
答案 1 :(得分:3)
该事件不会立即广播,它将被发送到队列,只有当您收听或处理队列时,才会消耗该事件。如果要立即执行作业,请设置QUEUE_DRIVER = sync。见:laravel queue
答案 2 :(得分:1)
我对Num8er的答复表示反对,但我还发现了其他一些问题,因此也许它们也可以为您提供帮助。
1)从频道名称的开头删除所有“ private-”。这些由各种库(例如socket.io/laravel-echo)在后台处理。如果您查看任何调试输出,则将在通道名称的前面看到“ private-”,但无需添加这些名称。
2)如果您正在使用redis,请确保REDIS_PREFIX在.env文件中设置为空字符串。默认情况下,它设置为“ laravel_database”之类的东西,这会弄乱通道名称。
REDIS_PREFIX=
3)确保您的laravel-echo服务器正在运行(以及redis / pusher)。另外,您还需要确保队列工作器正在运行:
php artisan queue:work
4)值得在Echo Server上启用调试输出,因为这将告诉您有关流量的有用信息(例如,通道名称),因此修改laravel-echo-server.json文件(在项目根目录中),以便devMode为设置为true:
"devMode": true,
答案 3 :(得分:0)
@materliu:这是一个很好的提示。就我而言,我没有创建将工作目录设置为我正在处理的项目的队列。使用马戏团。该事件已在代码中触发,但没有作业侦听器可用。我一运行“ php artisan queue:listen”,突然所有以前的广播都被处理了。
通常很难找出复杂系统的哪个部分不起作用。
答案 4 :(得分:0)
对于我来说,我的事件类文件是由“ make:event”生成的,它确实具有broadcastOn
方法...但是没有implements ShouldBroadcast
〜
导致laravel-echo-server没有输出〜
Laravel Framework 8.13.0