在私有频道广播事件消息
在上面的示例广播事件 UserSignedUp
中,我们通过 Channel
定义了一个公共频道广播,即所有客户端都可以接收到这个事件消息:
public function broadcastOn(){
return new Channel('test-channel');
}
定义私有频道广播事件类
不过很多时候,我们的业务需要实现的都是在私有频道发布消息,比如一个微信群或者 QQ 群内的某个用户发布了消息,只有这个群内的用户才能接收到消息,不可能其他群能收到消息,否则就乱套了,要实现这样的功能,需要借助 Laravel 提供的私有频道类 PrivateChannel
。
我们新建一个广播事件类 UserSendMessage
:
php artisan make:event UserSendMessage
然后基于 PrivateChannel
编写一个在私有频道(指定微信群)分发的广播事件消息:
<?php namespace App\Events;use App\Models\User;use Illuminate\Broadcasting\Channel;use Illuminate\Broadcasting\InteractsWithSockets;use Illuminate\Broadcasting\PresenceChannel;use Illuminate\Broadcasting\PrivateChannel;use Illuminate\Contracts\Broadcasting\ShouldBroadcast;use Illuminate\Foundation\Events\Dispatchable;use Illuminate\Queue\SerializesModels;class UserSendMessage implements ShouldBroadcast{
use Dispatchable, InteractsWithSockets, SerializesModels;public User $user;public string $message;public int $groupId;public string $broadcastQueue = 'broadcast';/**
* Create a new event instance.
*
* @param User $user
* @param $message
* @param $groupId
*/public function __construct(User $user, $message, $groupId){
$this->user = $user;$this->message = $message;$this->groupId = $groupId;
}/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/public function broadcastOn(){
return new PrivateChannel('wechat.group.' . $this->groupId);
}
}
客户端接收私有频道广播消息
这样一来,这个事件消息只会广播给监听 'wechat.group.' . $this->groupId
频道的客户端,在客户端(在 resources/views/websocket.blade.php
中模拟),我们可以通过 Echo.private
方法接收上面这个私有频道广播的消息:
...
<script type="text/javascript">let groupId = 1;window.Echo.private('wechat.group.