Канали бувають трьох типів, і різниця між ними - саме в доступі.
Публічний - слухати може будь-хто, хто знає назву:
class VacancyPublished implements ShouldBroadcast
{
public function broadcastOn(): Channel
{
return new Channel('vacancies');
}
}
Годиться лише для того, що й так публічне.
Приватний - потребує авторизації:
public function broadcastOn(): PrivateChannel
{
return new PrivateChannel('user.'.$this->user->id);
}
Правило описується в routes/channels.php:
Broadcast::channel('user.{userId}', function (User $user, int $userId) {
return $user->id === $userId;
});
Клієнт спершу звертається до /broadcasting/auth, і лише отримавши підпис, підписується на канал.
Presence - приватний плюс список присутніх: хто зараз онлайн, хто друкує.
Де помиляються:
- Публічний канал для приватних даних. Назву каналу видно у фронтенді, тож
Channel('user.'.$id)слухається ким завгодно з перебором id. - Замикання авторизації, що завжди повертає
true. Це те саме, що публічний канал, але виглядає безпечно. - Забувають, що подія несе всю модель. За замовчуванням у payload потрапляють усі публічні властивості - разом із полями, яких клієнт бачити не мусить. Формуйте payload явно через
broadcastWith(). - Приватні дані у назві каналу. Email чи токен у назві видно всім, хто дивиться трафік.
Практично: усе, що стосується конкретного користувача, - PrivateChannel; payload завжди явний.