Laravel事件未被广播

时间:2016-12-19 08:03:04

标签: laravel events vue.js laravel-echo

我正在处理应用的聊天/消息功能。当用户发送消息时,我希望触发并广播特定事件。我当时希望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的频道。

5 个答案:

答案 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