使用 Laravel-echo-server 构建实时应用(二)私有频道
在上一篇 文章 中,我们谈到搭建 Laravel Echo 服务,在本文中,我将告诉你私有频道的真正含义,以及它们为什么非常有用。如果你没有读过我之前的文章,或仍需要了解整个内容,建议你再读一下。
私有频道允许你广播只对特定用户或群组可见数据片段。比如在你的团队成员中,那么你只需要拥有一个允许团队成员加入该频道并收听活动的频道。
在我们之前的代码中,我们运行了下面的代码片段:
window.Echo.channel('test-event')
.listen('ExampleEvent', (e) => {
console.log(e);
});
这非常酷,但如果我想广播某些包含特定用户信息的数据呢?这时就需要私有频道出场了。这将需要你进行认证,让我快速开始演示一下。
首先,在你的 Laravel 应用中开启认证(如果你已经有一个完整的带有授权认证的 Laravel 应用,则跳过此步骤)。
$ php artisan make:auth
接下来迁移你的数据库(在 .env
文件中配置数据库连接信息),并在上述命令创建的注册页面上注册一个帐户。
从整合私有频道开始
首先,我们创建一个通过私有频道广播的事件类:
$ 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);
例如,如果你注册过(所以你的用户 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>
欢迎你以自己的方式做到这一点,我觉得这是最令人满意的做法。你也可以临时对这个值进行硬编码,然后以另一种方式解决这个问题,这取决于你。
现在,打开 routes/channels.php
文件,然后修改广播授权的路由:
Broadcast::channel('user.{id}', function ($user, $id) {
return (int) $user->id === (int) $id;
});
这意味着,我们会对用户进行校验。
channels.php
文件中的频道路由,描述了认证逻辑是如何完成的以及某用户是否可以访问该频道。你可以在里面写任何的逻辑,只要它返回一个布尔值就可以了。
如果你是一个比较有远见的人,那么这个代码会有什么影响?你也许会想:“嗯,如果我继续增加逻辑或创建更多的频道,是不是会让我的 channels.php
文件变得非常混乱且无法阅读?”
是的,你答对了。如果你继续在 channels.php
文件中添加频道,它将变得杂乱无章,这也就是定制 广播频道 的缘由,稍后,我将再写一篇文章来介绍它。
现在,你可以登陆并刷新浏览器,检查一下 Laravel Echo 服务,看认证逻辑是否已经工作。
认证失败:
认证成功:
当你的服务完成了正确的身份认证后,你就可以发送私有数据了!
如前所述,当你想广播事件并进行测试时,你必须将你的用户模型传递到事件上来与用户通信,你可以通过在 routes/web.php
文件中添加路由来轻松实现:
Route::get('test-broadcast', function(){
broadcast(new \App\Events\PrivateEvent(auth()->user()));
});
我在以前的文章中描述过如果你打开两个选项卡就可以看见输入的数据,你可以先退出,然后通过私有频道去访问页面,以此来验证身份,你将会注意到验证失败。
同样,你将会找到我以前关于设置的文章 Laravel Echo Server here。
感谢您的阅读!如果您有任何问题或者意见,请不要犹豫,随时发表您的意见或者建议。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
我想改变广播私有频道的auth 该如何去做呢
能够认证 但是报Unable to join channel. Member data for presence channel missing是什么原因造成的