加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – Laravel Echo私人频道与Laravel echo服务器| Redis的

发布时间:2020-12-14 19:48:06 所属栏目:大数据 来源:网络整理
导读:场景:客户可以将客户引荐给其他客户. 每个引用都需要存储在DB表行中.接收推荐的客户应该看到该活动的通知. 创建新的推荐并发送事件: $totalRefers = [];foreach ($array as $to) { $refer = new ClientReferral; $refer-user_id = $user_id; $refer-by = $
场景:客户可以将客户引荐给其他客户.
每个引用都需要存储在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);

事件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->包含该用户的ID:

public function broadcastOn()
{
    return new PrivateChannel('referral.' . $this->referral->to);
}

更新频道以根据接收推荐的用户的ID授权当前用户:

Broadcast::channel('referral.{refereeId}',$refereeId) {
    return $user->id == $refereeId;
});

而且,在客户端,请在同一频道上收听:

window.Echo.private('referral.' + window.custom.userId)
    .listen(e => console.log(e.referral));

因为我们不再监听特定的引用ID,所以我们可以在页面加载期间而不是在AJAX响应回调中初始化Echo订阅者.

广播事件旨在用于正常请求/响应周期之外的实时操作(包括AJAX请求).在这个问题的情况下,我们希望在页面加载时为每个客户启动Echo监听器 – 而不是在特定请求之后 – 以便他们可以在其他客户将客户端引用给他们时随时接收通知.

流程如下:

>客户1和客户2都打开应用程序,在客户端启动Echo.>客户1为客户2创建推荐.>客户1的浏览器发送AJAX请求以保存引荐.> Laravel将该活动发布到Customer 2的频道.>客户2的浏览器通过Echo接收事件,Echo正在监听该频道.>您编写的用于处理该事件的代码会在Customer 2的浏览器中创建通知.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读