Laravel Echo 私人频道和 Laravel echo 服务器 |雷迪斯

Posted

技术标签:

【中文标题】Laravel Echo 私人频道和 Laravel echo 服务器 |雷迪斯【英文标题】:Laravel Echo private channel with Laravel echo server | Redis 【发布时间】:2019-02-08 10:04:18 【问题描述】:

场景:客户可以将客户推荐给其他客户。 每个引用都需要存储在数据库表行中。收到推荐的客户应该会看到该事件的通知。

创建一个新的推荐并发送事件:

$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. “现在当前代码的问题是接收者无法订阅这个频道”你说的“这个频道”是什么意思? 2.“按照这个逻辑,我想得到那个特定的推荐”什么是“那个特定的推荐”? 3.“该特定推荐及其数据”包含在此数据中的哪些内容? 我认为您的代码没有任何问题。您拥有一切,如果您需要在前面显示额外的数据,请在回调中发送该数据,解析并显示。如果我弄错了,你能把你的问题改成简单的词吗? 【参考方案1】:

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

不要为推荐实体本身创建通道上下文,而是发布到为接收推荐的用户指定的通道。我猜$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 和客户 2 都打开了应用程序,这会在客户端启动 Echo。 客户 1 为客户 2 创建推荐。 客户 1 的浏览器发送 AJAX 请求以保存推荐。 Laravel 将事件发布到客户 2 的频道。 客户 2 的浏览器通过 Echo 接收事件,Echo 正在该通道上侦听。 您为处理该事件而编写的代码会在客户 2 的浏览器中创建一个通知。

【讨论】:

似乎是文件,但我将如何将创建的推荐返回给window.Echo.private(.... @Grammer 默认情况下,Laravel 序列化事件的公共属性。例如,如果事件包含$referral 属性,我们可以在客户端使用相同的属性访问它。我更新了最后一个例子来展示这一点。

以上是关于Laravel Echo 私人频道和 Laravel echo 服务器 |雷迪斯的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Laravel echo server、redis 和 socket.io 验证 laravel 私人频道

带有私有通道的 Laravel Echo SocketIO

Laravel echo - 无法通过私有频道进行身份验证

Laravel Echo + VueJS 广播/认证问题

Laravel Echo 和耳语

Laravel 使用 Socket.io 广播到私人频道