6

我在我的项目中实现了 Laravel 广播。一切正常,但我想知道是否可以收听所有事件而不仅仅是特定事件?

目前我的前端有这个代码:

window.Echo.channel('office-dashboard')
  .listen('CompanyUpdated', (e) => {
    console.log(e.company);
  });
  .listen('CompanyDeleted', (e) => {
    console.log(e.company);
  });

我想以这样一种方式组织我的事件,以便我可以抓住它到底是什么类型的事件,以及执行了什么样的动作。但是,如果我仍然必须像现在这样专门聆听每个事件,那将毫无用处。我想收听频道中的所有事件,这可能吗?

我阅读了文档,但那些只谈论如何收听特定事件。

4

3 回答 3

2

listenToAll()如果你使用 pusher 作为你的广播驱动程序,你可以从你的 Laravel Echo 实例中访问一个方法。简而言之,您可以执行以下操作来监听特定频道上的所有事件:

Echo.private(`office-dashboard`)
   .listenToAll((event, data) => {
      // do what you need to do based on the event name and data
      console.log(event, data)
   });

listenToAll()方法只接受一个参数,一个回调,它将接收事件的名称作为第一个参数,并将与事件关联的任何数据作为第二个参数。

于 2021-08-27T17:12:13.850 回答
2

我遇到了同样的情况。我认为您需要收听各个频道。但是您可以像下面这样编写更简洁的代码。

    const channel = window.Echo.channel('office-dashboard')

    const eventsTolisten = [
      'CompanyUpdated',
      'CompanyDeleted',
    ]

    eventsTolisten.forEach(event => {
      channel.listen(event, e => {
        this.handleSocketEvents({
          name: event,
          data: e.data
        })
      })
    })
于 2020-02-18T12:04:01.520 回答
1

是的,这是可能的,我 5 分钟前刚刚在我的应用程序上实现了它。在您的所有事件中使用广播,如下所述:

https://laravel.com/docs/8.x/broadcasting#broadcast-name

然后您可以使用 broadcastWith 函数包含事件的名称:

https://laravel.com/docs/8.x/broadcasting#broadcast-data

- - 服务器端 - -

public function broadcastWith()
{
    return[
        'id' => 'RoomJoined',
        'message' => 'new user joined the room!'
    ];
}

public function broadcastAs()
{
    return 'event';
}

- - 客户端 - -

window.Echo.channel(this.channel).listen(".event", response => {
  console.log(response);
});

要区分事件,您可以在侦听器中使用 if 语句或传递函数名称以直接调用,每个事件的优缺点。

于 2021-01-07T18:52:42.810 回答