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

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

一个 channel 类的示例

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

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

开始动手

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

$ 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)
{
    //
}

好啦,现在来看看我的  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);

另外,如果你在 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);
}

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

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

Broadcasting - Laravel - The PHP Framework For Web Artisans

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

感谢阅读本文!

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

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

译文地址:https://learnku.com/laravel/t/13908/usin...

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

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

5年前 评论

php artisan make:channel这个命令是自己写的吗,laravel没有自带这个吧?

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!