我正在使用Laravel Echo存在通道来显示在他们开始考试的某个页面上有多少人在线。但是,如果用户已经加入到通道,则不会考虑使用该页面的用户的另一个会话。Laravel Echo将忽略同一用户的任何其他连接。如果我们想建个聊天室就说得通了。然而,在我的例子中,我想知道用户参加了多少活动考试,即使用户是相同的。
是否有办法修改这个默认行为?
为了知道用户启动了哪个考试,我修改了authEndpoint以包含其id。
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'sapio',
wsHost: window.location.hostname,
wsPort: 80,
wssPort: 443,
disableStats: true, // we dont want pusher send statistic
forceTLS: false,
enabledTransports: ['ws', 'wss'],
authEndpoint: window.location.hostname + "/broadcasting/auth?examId=" + examId
});
存在渠道:
Broadcast::channel('live.exams', function ($user) {
//Here I take the exams id that is I provided in the authorization endpoint
return request('examId');
}, ['guards' => ['web','api']]);
我找到了一个方法。
为了唯一地标识每个广播频道请求,Laravel使用广播标识符。看看vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php
中的validAuthenticationResponse
public function validAuthenticationResponse($request, $result)
{
if (Str::startsWith($request->channel_name, 'private')) {
return $this->decodePusherResponse(
$request, $this->pusher->socket_auth($request->channel_name, $request->socket_id)
);
}
$channelName = $this->normalizeChannelName($request->channel_name);
$user = $this->retrieveUser($request, $channelName);
$broadcastIdentifier = method_exists($user, 'getAuthIdentifierForBroadcasting')
? $user->getAuthIdentifierForBroadcasting()
: $user->getAuthIdentifier();
return $this->decodePusherResponse(
$request,
$this->pusher->presence_auth(
$request->channel_name, $request->socket_id,
$broadcastIdentifier, $result
)
);
}
$broadcastIdentifier
可以通过为用户创建getAuthIdentifierForBroadcasting
方法自定义。默认情况下,标识符将是用户id。但是,您可以定义一个不重复的自定义id。然后,相同的用户将显示在状态通道中。
因此,在我的情况下,我添加followings到我的用户,并设置自定义id每当我需要它。
private $CustomAuthIdentifierForBroadcasting = null;
public function setCustomAuthIdentifierForBroadcasting($id) {
$this->CustomAuthIdentifierForBroadcasting = $id;
}
public function getAuthIdentifierForBroadcasting() {
return $this->CustomAuthIdentifierForBroadcasting ?? $this->getAuthIdentifier();
}