Laravel回声服务器的Laravel Echo私人频道雷迪斯

时间:2018-09-03 10:48:55

标签: php laravel redis socket.io laravel-echo

方案:一个客户可以将一个客户推荐给另一个客户。 每个引用都需要存储在数据库表行中。收到转介的客户应看到有关该事件的通知。

创建新的引荐并分发事件:

$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的形式在通知栏中显示。

我该如何实现?

1 个答案:

答案 0 :(得分:4)

问题中显示的事件仅广播到该特定推介实体的频道。但是,订阅此频道的接收者应该接收所有引用他们的推荐实体的事件。

而不是为引荐实体本身创建频道上下文,而是发布到为用户指定的接收引荐的频道。我猜测$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订阅者。

广播事件旨在对正常请求/响应周期(包括AJAX请求)之外的实时操作有用。对于此问题,我们希望在页面加载时(而不是在特定请求之后)为每个客户启动Echo侦听器,以便在其他客户将客户推荐给他们时,他们可以接收通知。

流程如下:

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