我正在尝试使用Laravel Broadcast和Pusher为每个用户会话创建唯一的频道。 VueJS用于前端。在这种情况下,我试图保存一个session
变量作为通道名。我不使用用户身份验证,因此无法仅基于经过身份验证的用户ID创建频道。
因此,我在安装组件时会生成一个会话hash
变量,然后使用生成的哈希值来激活通道:
mounted() {
axios.get('/file-downloads/session')
.then(response => {
Echo.channel('file.' + response.data)
.listen('.file.downloaded', (e) => {
console.log('Do something');
});
})
},
路线:
Route::get('/file-downloads/session', function () {
if (!session()->exists('fileDownloadHash')) {
session(['fileDownloadHash' => str_random(30)]);
}
return session('fileDownloadHash');
});
具有broadcastOn()
函数的事件:
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
if (!session()->exists('fileDownloadHash')) {
session(['fileDownloadHash' => str_random(30)]);
}
return new Channel('file.' . session('fileDownloadHash'));
}
但是,第一次加载页面时,生成的哈希变量不匹配。重新加载后,它们将匹配,因为当然可以设置会话,并且不会被路由/控制器功能或广播事件覆盖。因此,这两个请求似乎是同时完成的。
如何在这些请求被点击之前保存该会话哈希?
我在这里使用的会话方法可能是愚蠢的,在这种情况下(用户会话的唯一通道)有更好的解决方案。