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

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

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

感谢阅读本文!

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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

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

2个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!