Laravel. Несколько каналов или персональный канал для каждого пользователя? - PullRequest
0 голосов
/ 22 октября 2019

Я использую трансляцию событий в Laravel. Я использую ролевый доступ к уведомлениям. У меня есть кастомная защита для трансляции. Когда пользователь подключается к каналу, клиент отправляет access_token с правами доступа на сервер. Сервер проверяет этот access_token и разрешает соединение (я использую стороннюю службу Auth0 для аутентификации пользователей, это означает, что каждый раз, когда пользователь подключается к каждому широковещательному каналу, требуется некоторое время для проверки токена на стороне сервера).

У меня естьнесколько событий в моем приложении, которые я хочу транслировать. Должен ли я создать несколько частных каналов (по одному на событие) для каждого пользователя, например:

window.Echo.private('channel1'+user_id)
  // This channel can translate only one event - "firstEvent"
  .listen("firstEvent", (mes) => {
      console.log(mes);
})
window.Echo.private('channel2'+user_id)
  // This channel can translate only one event - "secondEvent"
  .listen("secondEvent", (mes) => {
      console.log(mes);
})
// etc.

Затем на стороне сервера я проверяю (в закрытии на routs / channel.php), есть ли у пользователя разрешение наэтот канал или нет, и разрешить или запретить ему подключаться к каналу. И когда событие срабатывает, в его трансляции я делаю что-то вроде:

public function broadcastOn()
{
    $users_from_db = \App\NotificationUsers::where('permission',$this->permission)->get();
    foreach($users_from_db as $user){
        return new PrivateChannel('connections'.$user->id); 
    }

}
// Permission for each event is defined in each event class as private property.

Таким образом, каждый пользователь при начальной загрузке страницы пытается подключиться к нескольким каналам, и, если он разрешает, он получает уведомления, не разрешается - не получает.

Или

Я должен создать один канал:

window.Echo.private('singleChannel.'+user_id)
  .listen("Event1", (mes) => {
      console.log(mes);
})
window.Echo.private('singleChannel.'+user_id)
  .listen("Event2", (mes) => {
      console.log(mes);
})

или ... любой другой вариант? Что такое хорошая практика?

...