10

我正在为应用程序开发聊天/消息功能。当用户发送消息时,我希望触发并广播特定事件。然后我希望 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) 添加了 auth check in 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) 创建了 Event App\Events\UserSentMessage,它在一个PrivateChannel命名的chat. 我也尝试过广播到Channel. 我检查并通过调用event()控制器中的帮助程序触发了事件,它似乎没有被广播。我也尝试过使用broadcast提到的控制器中的方法。

6)mounted在有效的 Vue 组件中的 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 订阅活动时Echo.private()。它似乎在频道名称前private加上private-chat.

4

5 回答 5

30

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

php artisan queue:listen

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

于 2016-12-21T04:25:20.800 回答
4

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

于 2017-04-07T11:39:33.697 回答
4

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

Laravel 框架 8.13.0

于 2020-11-24T06:46:07.857 回答
1

我赞成 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,
于 2020-03-23T04:05:49.647 回答
0

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

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

于 2018-12-04T15:37:24.287 回答