Я пытаюсь создать уникальные каналы для каждой пользовательской сессии с Laravel Broadcast и Pusher. VueJS используется для внешнего интерфейса. В этом случае я пытаюсь сохранить переменную session
, которая используется в качестве имени канала. Я не использую аутентификацию пользователя, поэтому невозможно просто создать каналы на основе идентифицированного идентификатора пользователя.
Поэтому я генерирую переменную сеанса 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'));
}
Однако сгенерированные хеш-переменные не совпадают, когдазагрузка страницы в первый раз. После перезагрузки они совпадают, потому что тогда, конечно, сеанс установлен и не перезаписывается функцией маршрута / контроллера или событием широковещания. Таким образом, кажется, что эти два запроса выполняются одновременно.
Как я могу сохранить этот хэш сеанса до того, как эти запросы будут обработаны?
Вероятно, подход к сеансу, который я здесь использую, глуп и существуетгораздо лучшее решение для такого случая (уникальный канал для сеанса пользователя).