Gam*_*mer 8 php redis socket.io laravel laravel-echo
场景:客户可以将客户引荐给另一个客户.每个引用都需要存储在DB表行中.接收推荐的客户应该看到该活动的通知.
创建新的推荐并发送事件:
$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);
Run Code Online (Sandbox Code Playgroud)
事件broadcastOn()方法:
public function broadcastOn() {
return new PrivateChannel('referral.' . $this->referral->id);
}
Run Code Online (Sandbox Code Playgroud)
这个频道:
Broadcast::channel('referral.{id}', function ($user, $id) {
// let's say it's true for the time being
return true;
});
Run Code Online (Sandbox Code Playgroud)
并且请求是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');
});
}
});
Run Code Online (Sandbox Code Playgroud)
现在当前代码的问题是接收器无法订阅此通道,因为事件是动态创建的,并且我不能将通道名称设置为静态,因为引用是在运行时进入的.
接收方如何订阅和收听动态事件?
有了这个逻辑,我想获得特定的推荐及其数据,以便在HTML的通知栏中显示它.
我怎样才能做到这一点?
问题中显示的事件仅广播到该特定推荐实体的频道。然而,订阅该频道的接收者应该接收引用他们的所有引用实体的事件。
不要为推荐实体本身创建通道上下文,而是发布到为接收推荐的用户指定的通道。我猜测其中$referral->to包含该用户的 ID:
public function broadcastOn()
{
return new PrivateChannel('referral.' . $this->referral->to);
}
Run Code Online (Sandbox Code Playgroud)
更新通道以根据接收推荐的用户的 ID 授权当前用户:
Broadcast::channel('referral.{refereeId}', function ($user, $refereeId) {
return $user->id == $refereeId;
});
Run Code Online (Sandbox Code Playgroud)
并且,在客户端,监听同一频道:
window.Echo.private('referral.' + window.custom.userId)
.listen(e => console.log(e.referral));
Run Code Online (Sandbox Code Playgroud)
因为我们不再侦听特定的引用 ID,所以我们可以在页面加载期间而不是在 AJAX 响应回调中初始化 Echo 订阅者。
广播事件设计用于正常请求/响应周期(包括 AJAX 请求)之外的实时操作。就这个问题而言,我们希望在页面加载时(而不是在特定请求之后)为每个客户启动 Echo 侦听器,以便他们可以在其他客户将客户推荐给他们时随时收到通知。
流程如下所示:
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |