使用 Laravel-echo-server 构建实时应用(三)广播频道类
在我以前的这篇 文章 中,我谈论了关于私有频道的问题,如果在这些渠道里面放置太多逻辑,会让你的 channels.php
文件变得很混乱。
一个 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
这是我第一次在社区翻译,翻译不好的地方请多指教。
php artisan make:channel这个命令是自己写的吗,laravel没有自带这个吧?