使用 Laravel-echo-server 构建实时应用(二)私有频道

翻译 Insua ⋅ 于 4周前 ⋅ 279 阅读 ⋅ 原文地址

站点的翻译文章创建时,您将第一时间收到通知。

这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍

file
在上一篇 文章 中,我们谈到搭建 Laravel Echo 服务,在本文中,我将告诉你私有频道的真正含义,以及它们为什么非常有用。如果你没有读过我之前的文章,或仍需要了解整个内容,建议你再读一下。

file

私有频道允许你广播只对特定用户或群组可见数据片段。比如在你的团队成员中,那么你只需要拥有一个允许团队成员加入该频道并收听活动的频道。

Honvid 翻译于 4周前

查看其他 1 个版本

在我们之前的代码中,我们运行了下面的代码片段:

 window.Echo.channel('test-event')
    .listen('ExampleEvent', (e) => {
        console.log(e);
    });

这非常酷,但如果我想广播某些包含特定用户信息的数据呢?这时就需要私有频道出场了。这将需要你进行认证,让我快速开始演示一下。

首先,在你的 Laravel 应用中开启认证(如果你已经有一个完整的带有授权认证的 Laravel 应用,则跳过此步骤)。

$ php artisan make:auth

接下来迁移你的数据库(在 .env 文件中配置数据库连接信息),并在上述命令创建的注册页面上注册一个帐户。

Honvid 翻译于 4周前

从整合私有频道开始

首先,我们创建一个通过私有频道广播的事件类:

$ php artisan make:event PrivateEvent

在 App/Events 文件夹中打开创建好的 PrivateEvent.php 文件,然后确保该类实现了 ShouldBroadcast 接口:

class PrivateEvent implements ShouldBroadcast

确保构造方法接收一个 User 模型,并创建一个 $user 属性:

public $user;

public function __construct(User $user)
{
    $this->user = $user;
}

在 broadcastOn 方法中,把 PrivateChannel 的名称修改的更“私有化”,我们可以使用 user.{id} 这种语法:

return new PrivateChannel('user.' . $this->user->id);
Honvid 翻译于 4周前

例如,如果你注册过(所以你的用户 ID 会是 1 ),这个事件类将会在名为 user.1 的频道上广播。

现在,在 JS 代码中,添加如下代码来收听私有频道:

window.Echo.private('user.' + window.Laravel.user)
    .listen('PrivateEvent', (e) => {
        console.log(e);
    });

你可能注意到我使用了 window.Laravel.user ,这是因为在 <head> 标签中,我已经添加了如下代码:

<script>
    window.Laravel = {!! json_encode([
        'user' => auth()->check() ? auth()->user()->id : null,
    ]) !!};
</script>

欢迎你以自己的方式做到这一点,我觉得这是最令人满意的做法。你也可以临时对这个值进行硬编码,然后以另一种方式解决这个问题,这取决于你。

Honvid 翻译于 4周前

现在,打开 routes/channels.php 文件,然后修改广播授权的路由:

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

这意味着,我们会对用户进行校验。

channels.php 文件中的频道路由,描述了认证逻辑是如何完成的以及某用户是否可以访问该频道。你可以在里面写任何的逻辑,只要它返回一个布尔值就可以了。

如果你是一个比较有远见的人,那么这个代码会有什么影响?你也许会想:“嗯,如果我继续增加逻辑或创建更多的频道,是不是会让我的 channels.php 文件变得非常混乱且无法阅读?”

是的,你答对了。如果你继续在 channels.php 文件中添加频道,它将变得杂乱无章,这也就是定制 广播频道 的缘由,稍后,我将再写一篇文章来介绍它。

现在,你可以登陆并刷新浏览器,检查一下 Laravel Echo 服务,看认证逻辑是否已经工作。

Honvid 翻译于 4周前

认证失败:

file

认证成功:

file

当你的服务完成了正确的身份认证后,你就可以发送私有数据了!

如前所述,当你想广播事件并进行测试时,你必须将你的用户模型传递到事件上来与用户通信,你可以通过在 routes/web.php 文件中添加路由来轻松实现:

Route::get('test-broadcast', function(){
    broadcast(new \App\Events\PrivateEvent(auth()->user()));
});
Honvid 翻译于 4周前

我在以前的文章中描述过如果你打开两个选项卡就可以看见输入的数据,你可以先退出,然后通过私有频道去访问页面,以此来验证身份,你将会注意到验证失败。

同样,你将会找到我以前关于设置的文章 Laravel Echo Server here

感谢您的阅读!如果您有任何问题或者意见,请不要犹豫,随时发表您的意见或者建议。

purple_ling 翻译于 3周前

原文地址:https://medium.com/@dennissmink/laravel-...

译文地址:https://laravel-china.org/topics/13521/u...


本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

回复数量: 0
    暂无评论~~
    您需要登陆以后才能留下评论!

    Composer 中国全量镜像

    Top 100 扩展包

    Lumen 中文文档

    Laravel 速查表

    Laravel 中文文档

    Laravel 项目开发规范

    Laravel 开发环境部署

    Elasticsearch-PHP 中文文档

    Lumen 中文文档

    GraphQL PHP 中文文档

    社区文档撰写指南

    TDD 构建 Laravel 论坛笔记

    PHP PSR 标准规范

    PHP 设计模式全集

    Dingo API 中文文档