Как использовать Laravel Broadcast с уникальными каналами для каждого сеанса пользователя - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь создать уникальные каналы для каждой пользовательской сессии с 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'));
}

Однако сгенерированные хеш-переменные не совпадают, когдазагрузка страницы в первый раз. После перезагрузки они совпадают, потому что тогда, конечно, сеанс установлен и не перезаписывается функцией маршрута / контроллера или событием широковещания. Таким образом, кажется, что эти два запроса выполняются одновременно.

Как я могу сохранить этот хэш сеанса до того, как эти запросы будут обработаны?

Вероятно, подход к сеансу, который я здесь использую, глуп и существуетгораздо лучшее решение для такого случая (уникальный канал для сеанса пользователя).

...