【问题标题】:Laravel event not being BroadcastLaravel 事件未广播
【发布时间】:2017-05-04 05:51:20
【问题描述】:

我正在为应用开发聊天/消息功能。当用户发送消息时,我希望触发并广播特定事件。然后,我希望 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 组件中的 mountedVue 生命周期钩子中添加了以下内容(组件正在按预期呈现数据等,只是不适用于 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() 助手。

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

【问题讨论】:

    标签: laravel events vue.js laravel-echo


    【解决方案1】:

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

    php artisan queue:listen
    

    UPD.:如果您在寻找更高级的解决方案,请阅读 laravel horizon

    【讨论】:

    • 完美!非常感谢!
    • 非常感谢。经过近4个小时的调试。你节省了我的时间。
    • 在拉了我几个小时的头发之后,你拯救了我的一天。我没有意识到这一切都堆积在队列中。谢谢!!
    • @num8er 感谢您从 2020 年开始!
    • 你是圣人!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      就我而言,我的事件类文件是由“make:event”生成的,它确实有broadcastOn 方法...但是没有implements ShouldBroadcast~ 导致 laravel-echo-server 无输出~

      Laravel 框架 8.13.0

      【讨论】:

        【解决方案4】:

        我赞成 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 为设置为真:

        "devMode": true,
        

        【讨论】:

          【解决方案5】:

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

          通常很难弄清楚复杂系统的哪个组件不起作用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-06-12
            • 2018-03-08
            • 2022-10-24
            • 1970-01-01
            • 1970-01-01
            • 2023-03-04
            • 2021-06-02
            相关资源
            最近更新 更多