Laravel 活动未播出

Laravel event not being Broadcast

我正在为某个应用开发 chat/message 功能。当用户发送消息时,我希望触发并广播特定事件。然后,我希望 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,它在名为 chatPrivateChannel 上广播。我也试过向 Channel 广播。我检查了一下,事件是通过调用控制器中的 event() 帮助器触发的,它似乎没有被广播。我也尝试在提到的控制器中使用 broadcast 方法。

6) 在有效的 Vue 组件中的 mounted Vue 生命周期挂钩中添加了以下内容(组件按预期呈现数据等,只是无法使用 Laravel Echo atm):

    Echo.private('chat').listen('UserSentMessage', (data) => {
                console.log(data);
            }, (e) => {
                console.log(e);
            });

也试过:

     Echo.channel('chat').listen('UserSentMessage', (data) => {
                console.log(data);
            }, (e) => {
                console.log(e);
            });

Vue 组件正在成功订阅指定的频道。推送器调试控制台识别出它正在被订阅,但是触发的事件永远不会被广播。

似乎是广播事件有问题。我也尝试过使用 broadcast() 助手,而不是 event() 助手。

此外,当使用 Laravel Echo via Echo.private() 订阅事件时。它似乎在频道名称前加上 private,所以我也尝试过广播(在活动中)到名为 private-chat.

的频道

我可以建议您检查您的 .env 文件
并确保 BROADCAST_DRIVER 不是 log(尝试 pusher
并且不要忘记保留 运行 队列侦听器:

php artisan queue:listen

更新:如果您需要更高级的解决方案,请阅读 laravel horizon

事件不会立即广播,它会被发送到队列中,只有当你在队列上监听或工作时,事件才会被消费。如果您想立即执行作业,请设置 QUEUE_DRIVER=sync 。参见:laravel queue

@materliu:这是一个很好的提示。在我的例子中,我没有创建一个工作目录设置为我正在处理的项目的队列。使用马戏团。该事件是在代码中触发的,但没有可用的作业侦听器。一旦我 运行 "php artisan queue:listen" 突然所有以前的广播都被处理了。

通常很难找出复杂系统的哪个组件不起作用。

我对 Num8er 的回复投了赞成票,但我也发现了一些其他问题,所以也许他们也能帮助你。

1) 删除频道名称开头的所有 'private-'。这些由各种库在幕后处理(例如 socket.io/laravel-echo)。如果您查看任何调试输出,您会看到 'private-' 前置到通道名称的前面,但您不需要添加这些。

2) 如果您使用的是 redis,请确保在您的 .env 文件中将 REDIS_PREFIX 设置为空字符串。默认情况下,它设置为 'laravel_database' 之类的东西,这会弄乱频道名称。

REDIS_PREFIX=

3) 确保你有 laravel-echo 服务器 运行(和 redis/pusher)。你还需要确保你有队列工作者 运行:

php artisan queue:work

4) 值得在您的 Echo 服务器上启用调试输出,因为这会告诉您有关流量的有用信息(例如频道名称),因此请修改 laravel-echo-server.json 文件(在您的项目根目录),以便将 devMode 设置为 true:

"devMode": true,

在我的例子中,我的事件 class 文件是由“make:event”生成的,它确实有 broadcastOn 方法...但是没有 implements ShouldBroadcast~ 它导致 laravel-echo-server 什么都不输出~

Laravel 框架 8.13.0