Laravel 使用 Laravel 回显服务器回显私人频道 | Redis
Laravel Echo private channel with Laravel echo server | Redis
场景:一个客户可以将一个客户推荐给另一个客户。
每个推荐都需要存储在 DB table 行中。收到推荐的客户应该会看到该活动的通知。
创建新推荐并发送事件:
$totalRefers = [];
foreach ($array as $to) {
$refer = new ClientReferral;
$refer->user_id = $user_id;
$refer->by = $by;
$refer->to = $to;
$refer->save();
array_push($totalRefers, $refer);
ReferralSent::dispatch($refer); // Here is the Event
}
return response()->json([
'status' => 'Success',
'message' => 'Client referred successfully to selected professionals.',
'data' => $totalRefers
], 200);
事件broadcastOn()
方法:
public function broadcastOn() {
return new PrivateChannel('referral.' . $this->referral->id);
}
频道:
Broadcast::channel('referral.{id}', function ($user, $id) {
// let's say it's true for the time being
return true;
});
并且请求是 Ajax POST 所以在成功回调中:
console.log('referral created');
res.data.forEach(function(entry) {
// window.custom.userId is the authenticated user ID:
if (entry.refer_to == window.custom.userId) {
window.Echo.private('referral.' + entry.id).listen('ReferralSent', ({data}) => {
console.log('You have received a new referral');
});
}
});
现在当前代码的问题是因为事件是动态创建的,接收者无法订阅这个频道,而且我不能将频道名称设为静态,因为推荐来了在 运行 时间。
接收者如何订阅和监听动态事件?
根据这个逻辑,我想获取特定推荐及其数据,以在 HTML 的通知托盘中显示它。
我怎样才能做到这一点?
问题中显示的事件仅向 特定推荐实体 的频道广播。但是,订阅此频道的接收者应该接收到 所有引用他们的推荐实体的事件。
不是为推荐实体本身创建频道上下文,而是发布到为接收推荐的 用户 指定的频道。我猜 $referral->to
包含该用户的 ID:
public function broadcastOn()
{
return new PrivateChannel('referral.' . $this->referral->to);
}
根据接收推荐的用户ID更新通道授权当前用户:
Broadcast::channel('referral.{refereeId}', function ($user, $refereeId) {
return $user->id == $refereeId;
});
并且,在客户端,收听同一频道:
window.Echo.private('referral.' + window.custom.userId)
.listen(e => console.log(e.referral));
因为我们不再监听特定的推荐 ID,所以我们可以在页面加载期间而不是在 AJAX 响应回调中初始化 Echo 订阅者。
广播事件旨在对正常 request/response 周期(包括 AJAX 请求)之外的 实时 操作有用。对于这个问题,我们希望在页面加载时(而不是在特定请求之后)为 每个 客户启动 Echo 侦听器,以便他们可以在其他客户引用客户时随时收到通知给他们。
流程如下所示:
- 客户 1 和客户 2 都打开应用程序,这会在客户端启动 Echo。
- 客户 1 为客户 2 创建了推荐。
- 客户 1 的浏览器发送 AJAX 保存推荐的请求。
- Laravel 将事件发布到客户 2 的频道。
- 客户 2 的浏览器通过正在该频道上侦听的 Echo 接收事件。
- 您为处理该事件而编写的代码会在客户 2 的浏览器中创建一个通知。
场景:一个客户可以将一个客户推荐给另一个客户。 每个推荐都需要存储在 DB table 行中。收到推荐的客户应该会看到该活动的通知。
创建新推荐并发送事件:
$totalRefers = [];
foreach ($array as $to) {
$refer = new ClientReferral;
$refer->user_id = $user_id;
$refer->by = $by;
$refer->to = $to;
$refer->save();
array_push($totalRefers, $refer);
ReferralSent::dispatch($refer); // Here is the Event
}
return response()->json([
'status' => 'Success',
'message' => 'Client referred successfully to selected professionals.',
'data' => $totalRefers
], 200);
事件broadcastOn()
方法:
public function broadcastOn() {
return new PrivateChannel('referral.' . $this->referral->id);
}
频道:
Broadcast::channel('referral.{id}', function ($user, $id) {
// let's say it's true for the time being
return true;
});
并且请求是 Ajax POST 所以在成功回调中:
console.log('referral created');
res.data.forEach(function(entry) {
// window.custom.userId is the authenticated user ID:
if (entry.refer_to == window.custom.userId) {
window.Echo.private('referral.' + entry.id).listen('ReferralSent', ({data}) => {
console.log('You have received a new referral');
});
}
});
现在当前代码的问题是因为事件是动态创建的,接收者无法订阅这个频道,而且我不能将频道名称设为静态,因为推荐来了在 运行 时间。
接收者如何订阅和监听动态事件?
根据这个逻辑,我想获取特定推荐及其数据,以在 HTML 的通知托盘中显示它。
我怎样才能做到这一点?
问题中显示的事件仅向 特定推荐实体 的频道广播。但是,订阅此频道的接收者应该接收到 所有引用他们的推荐实体的事件。
不是为推荐实体本身创建频道上下文,而是发布到为接收推荐的 用户 指定的频道。我猜 $referral->to
包含该用户的 ID:
public function broadcastOn()
{
return new PrivateChannel('referral.' . $this->referral->to);
}
根据接收推荐的用户ID更新通道授权当前用户:
Broadcast::channel('referral.{refereeId}', function ($user, $refereeId) {
return $user->id == $refereeId;
});
并且,在客户端,收听同一频道:
window.Echo.private('referral.' + window.custom.userId)
.listen(e => console.log(e.referral));
因为我们不再监听特定的推荐 ID,所以我们可以在页面加载期间而不是在 AJAX 响应回调中初始化 Echo 订阅者。
广播事件旨在对正常 request/response 周期(包括 AJAX 请求)之外的 实时 操作有用。对于这个问题,我们希望在页面加载时(而不是在特定请求之后)为 每个 客户启动 Echo 侦听器,以便他们可以在其他客户引用客户时随时收到通知给他们。
流程如下所示:
- 客户 1 和客户 2 都打开应用程序,这会在客户端启动 Echo。
- 客户 1 为客户 2 创建了推荐。
- 客户 1 的浏览器发送 AJAX 保存推荐的请求。
- Laravel 将事件发布到客户 2 的频道。
- 客户 2 的浏览器通过正在该频道上侦听的 Echo 接收事件。
- 您为处理该事件而编写的代码会在客户 2 的浏览器中创建一个通知。