Laravel Broadcaster 介绍

什么是广播?

广播 Broadcaster 是指发送方发送一条消息,订阅频道的各个接收方都能及时收到推送的消息,想象一下广播电视塔向外辐射发送消息的场景。

比如 A同学写了一篇文章,这时候 B同学在文章底下评论了,A同学在页面上是不用刷新就能收到提示有文章被评论了,这个本质上就是A同学收到了广播消息,这个广播消息是由B同学评论这个动作触发了发送广播消息。

Laravel Broadcast 模块组成

Alt text

在 Laravel 中可以 Broadcast 有三种驱动方式:

  • Pusher
  • Redis
  • Log

修改 .envBROADCAST_DRIVER 属性,或在 config/broadcasting.php 中配置。

在整个广播行为中,频道的类型有三种:

  • 公共频道 public
  • 私有频道 private
  • 存在频道 presence

公开频道

公开频道是任何人都可以订阅或监听的频道,默认定义的都是公开频道。

/**
 * Get the channels the event should be broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn()
{
    return ['test-channel'];
}

私有频道(Private Channel)

私有频道要求监听前必须先授权当前认证用户。

// 定义频道,绑定事件
var channel = pusher.subscribe('private-first-channel');
channel.bind('login', function(data) {
    alert(data);
});

如果订阅的是私有频道(频道名是以 private- 开头)或存在频道(频道名是以 presence- 开头),则会发出权限检查请求;对应的后端需要定义私有频道和存在频道的权限。

授权私有频道

通过向服务端发送包含频道名称的 HTTP 请求,来判断该用户是否允许监听该频道。使用 Laravel Echo 时,授权订阅私有频道的 HTTP 请求会自动发送。

频道的授权检测在 routes/channels.php 里,例如:

Broadcast::channel('first-channel', function ($user) {
    return (int) $user->id === 1;
});

注意:这里频道名不需要加 private-presence- 修饰前缀。

广播到私有频道

/**
 * Get the channels the event should be broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn()
{
    return new PrivateChannel('room.' . $this->message->room_id);
}

存在频道(Presence Channel)

存在频道构建于私有频道之上,并且提供了额外功能:获知谁订阅了频道。基于这一点,我们可以构建强大的、协作的应用功能,例如当其他用户访问同一个页面时通知当前用户。

授权存在频道

如果用户没有被授权加入存在频道,应该返回 false null; 如果用户被授权加入频道不要返回 `true`,而应该返回关于该用户的数据数组

Broadcast::channel('chat.*', function ($user, $roomId) {
    if ($user->canJoinRoom($roomId)) {
        return ['id' => $user->id, 'name' => $user->name];
    }
});

广播到存在频道

/**
 * Get the channels the event should be broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn()
{
    return new PresenceChannel('room.' . $this->message->room_id);
}

参考文章