fomvasss
@fomvasss
PHP developer

Как правильнее построить архитектуру приложения на Laravel + Broadcasting?

Разрабатываю приложение на Laravel, где будут чаты, переписки, уведомления...
Для вещания данных клиентам буду использовать Broadcasting (redis, laravel-echo-server, socket.io)

С Broadcasting и socketa-мы ранее вообще не работал, технически понял, но возникли вопросы:

1) как правильнее организовать каналы, название вещания, события Laravel?
Если например на сайте будут работать оповещения о новых сообщениях (навая заявка, непрочитанное сообщ.), события в чатах, события в обсуждениях - на все делать отдельный канал?

2) Как например отправлять данные только пользователям определенной группы, например чата? Как определить что этому пользователю нужно слать сообщение, даже через день...?
  • Вопрос задан
  • 905 просмотров
Решения вопроса 1
1. Канал для конкретных данных. например каналы:
  • личные сообщения (диалоги)
  • оповещения


2. Канал для конкретного диалога:
Broadcast::channel('chat.{roomId}', function ($user, $roomId) {
    if ($user->canJoinRoom($roomId)) { // Проверяем, разрешено ли пользователю входить в этот чат
        return ['id' => $user->id, 'name' => $user->name]; // Если да, возвращаем результат
    }
});


Echo.join(`chat.${roomId}`)
    .here((users) => {
        console.log("В этой комнате: ", users);
    })
    .joining((user) => {
        console.log("К нам присоединился: ", user.name);
    })
    .leaving((user) => {
        console.log("Ушел от нас: ", user.name);
    });


Подробнее: https://laravel.com/docs/5.5/broadcasting#authoriz...

UPD: Можно также использовать приватные каналы:
return new PrivateChannel('chat.' . $chatId);
Broadcast::channel('chat.{chatId}', function ($user, $chatId) {
    return $user->hasChat($chatId); // Проверяем состоит ли пользователь в чате
});


Echo.private(`chat.${chatId}`)
    .here((users) => {
        console.log("В этой комнате: ", users);
    })
    .joining((user) => {
        console.log("К нам присоединился: ", user.name);
    })
    .leaving((user) => {
        console.log("Ушел от нас: ", user.name);
    });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы