如何使用Laravel将变量传递给JavaScript以便在私人频道上广播?

js81xvg6  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(126)

我正在Laravel 9.42.2中构建一个应用程序,并设置了Laravel Echo和Soketi来广播事件。我可以成功地在公共频道上发送和接收广播,但我不知道如何在私人频道上广播。
根据文档,我可以用下面的示例代码做到这一点:

Echo.private(`orders.${orderId}`)
    .listen('OrderShipmentStatusUpdated', (e) => {
        console.log(e.order);
    });

我不明白的是${orderId}在哪里传递给JavaScript,我可以用PHP在后端创建私有通道,但我不知道前端应该在哪里接收它需要填充侦听器中占位符的变量。
我考虑过的方案:

  • 在每个响应的前面查询数据库,并将所有可能的ID列表发送回用户,以便存储起来供需要时使用(即,将与用户相关的所有orderId作为数组,并使用循环为每个数组创建侦听器)。我担心这会增加许多不必要的数据库访问,并为可能不需要的内容增加页面加载时间的开销。
  • 在控制器中添加一行,在调用事件调度之前将orderId解析为json。不知道为什么感觉不对,但确实如此。
u91tlkcl

u91tlkcl1#

你可以通过这个技巧。
orderId可以是页面url的一部分,也可以由模板中的隐藏元素表示,例如:

<input type="hidden" id="orderId" value="{{$orderId}}" />

如果选择隐藏元素,只需获取其值并传递给Echo.private()方法。

var orderId = document.getElementById('orderId').value;
window.Echo.private(`orders.` + orderId)
    .listen('OrderShipmentStatusUpdated', (e) => {
        console.log(e);
});

相关问题