使用 Laravel-echo-server 构建实时应用(三)广播频道类

翻译 Insua ⋅ 于 2周前 ⋅ 最后回复由 yanyin 14小时前 ⋅ 170 阅读 ⋅ 原文地址

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

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

file
在我以前的这篇 文章 中,我谈论了关于私有频道的问题,如果在这些渠道里面放置太多逻辑,会让你的 channels.php 文件变得很混乱。
file

一个 channel 类的示例

通过本文,我想向您介绍广播频道,它允许您将「频道逻辑」转移到自己的自定义类中。

如果此前你没有任何 Laravel Echo 的知识,我推荐你看一下我以前的这篇如何搭建一个 Laravel Echo 服务的 文章 ,现在我假设您已经搭建好了 Laravel Echo Server 相关环境并且能够运行了。

He110 翻译于 2周前

开始动手

用下面这条命令创建一个广播频道类:

$ php artisan make:channel ExampleBroadcastChannel

以上命令会在 App/Broadcasting 文件夹中新建一个名为 ExampleBroadcastChannel.php 的广播频道类文件。这个文件将是我们动手改造的地方。

当你打开这个文件,可以看见这个类包含一个构造函数和一个 join 方法。现在你可以把原先定义在 channels.php 文件中相应的频道授权逻辑迁移到 join 方法中。

每当用户请求通过这个广播频道,jion 方法将会被调用。所以我们将把验证用户能否进入频道的逻辑放在 jion 方法中。

广播频道类类似于:

/**
 * 验证用户能否通过频道。
 *
 * @param  \App\User  $user
 * @return array|bool
 */
public function join(User $user)
{
    //
}
yanyin 翻译于 2周前

好啦,现在来看看我的  routes/channels.php 文件中的一个频道授权逻辑示例:

Broadcast::channel('teams.{teamId}', function ($user, $teamId) {
    return $user()->teams()->find($teamId) ? true : false;
});

定义授权逻辑的回调函数将通过数据库查询用户是否在某个队伍中来判断用户能否收听这个频道(你可以执行其他任何数据库查询请求,这仅仅是一个例子,目的是让回调函数返回 true 或 false )。

然后把这个 channel 类中的授权回调函数迁移到 ExampleBroadcastChannel.php 文件中的 join 中:

/**
 * 验证用户能否通过频道。
 *
 * @param  \App\User  $user
 * @return array|bool
 */
public function join(User $user, $teamId)
{
    return $user->teams()->find($teamId) ? true : false;
}

同时也要在 channels.php 文件中把授权回调函数更新为 ExampleBroadcastChannel 这个频道类:

use App\Broadcasting\ExampleBroadcastChannel;

Broadcast::channel('teams.{teamId}', ExampleBroadcastChannel::class);
yanyin 翻译于 2周前

另外,如果你在 channels.php 文件中频道名称使用了占位符,那么在频道类中依然可以使用路由模型绑定:

use App\Broadcasting\ExampleBroadcastChannel;

Broadcast::channel('teams.{team}', ExampleBroadcastChannel::class);

频道类也可以是包含命名空间的完全限定名:

Broadcast::channel('teams.{team}', \App\Broadcasting\ExampleBroadcastChannel::class);

然后,在 ExampleBroadcastChannel.php 文件中编写授权回调逻辑(再次提醒,如何处理逻辑完全取决于你):

/**
 * 验证用户能否通过频道。
 *
 * @param  \App\User  $user
 * @return array|bool
 */
public function join(User $user, Team $team)
{
    return $team->users->contains($user);
}
yanyin 翻译于 2周前

如你所见,我们把广播授权回调逻辑重写到相应的频道类中,使得 channels.php 文件像框架中的 web.php 文件一样干净清爽。再也没有一大堆闭包了!

想获得更多关于频道类的信息,我推荐你参考 Laravel 官方文档:

Broadcasting - Laravel - The PHP Framework For Web Artisans

我真诚希望这篇文章对你有帮助,倘若你有疑问就在下面回复我。

感谢阅读本文!

yanyin 翻译于 2周前

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

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


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

回复数量: 1
  • yanyin 1
    2周前

    这是我第一次在社区翻译,翻译不好的地方请多指教。

暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

Elasticsearch-PHP 中文文档

Lumen 中文文档

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档