Когда первый раз читаешь доку по Broadcasting, кажется: «О, я просто напишу событие, Laravel сам всё отправит на фронт, и будет realtime-чат, как у Slack». Ха-ха, нет.
Broadcasting — это лишь транспорт для твоих событий. Ты обязан сам поднять сервер (Pusher, Laravel WebSockets, Redis + какой-нибудь мост) и только потом Laravel красиво всё разрулит. Если не понимаешь, как работают вебсокеты и подписки на каналы — готовься к ночным пляскам с console.log на фронте.
Установка: ничего лишнего
Laravel уже умеет Broadcasting. Ничего руками ставить не нужно, пока не определился с драйвером.
Драйвер: выбор определяет боль
В .env:
BROADCAST_DRIVER=pusher
Доступные варианты:
- log — пишет события в логи (полезно проверить, что всё вообще работает).
- redis — прокидывает события через Redis (дальше нужен отдельный сервер для клиентов).
- pusher — сразу вебсокеты из коробки, но платно, если нагрузка серьёзная.
- laravel-websockets — кастомный сервер на PHP, который имитирует Pusher. Работает, но жрёт память.
Событие: обычный PHP-класс
class OrderShipped implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $order;
public function __construct($order)
{
$this->order = $order;
}
public function broadcastOn()
{
return new Channel('orders');
}
}
Ключевой момент: событие должно имплементить ShouldBroadcast. Иначе Laravel его тихо проглотит, а ты потом ищи, где твои вебсокеты.
Отправка: просто event()
event(new OrderShipped($order));
Выглядит невинно, но если драйвер не поднят — события просто растворяются в воздухе.
Клиент: фронт — это половина дела
Laravel предлагает Echo:
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key',
cluster: 'eu',
forceTLS: true
});
Echo.channel('orders')
.listen('OrderShipped', (e) => {
console.log(e.order);
});
Красиво, но стоит что-то сломать в ключах или SSL — и ты снова смотришь в пустой console.log, думая, что Laravel глючит.
Грабли
- SSL и HTTPS. Если фронт на https, а вебсокеты без сертификата — соединение просто не откроется.
- Каналы. Публичные (
Channel), приватные (PrivateChannel) и presence-каналы работают по-разному. Залезешь не туда — словишь 403. - Pusher против WebSockets. На локалке всё летает, в проде Pusher внезапно ограничивает соединения, и ты вспоминаешь, что это не магия, а сервис с тарифами.
- Redis. Работает быстро, но без отдельного сервера, который будет слушать Redis и толкать в вебсокеты, смысла нет.
Вывод
Broadcasting в Laravel — не магия, а обёртка. Работает хорошо, если ты понимаешь, что у тебя под капотом: вебсокеты, каналы, авторизация, SSL.
Если нет — будешь сидеть с «почему мои события не доходят» и винить Laravel, хотя виноват твой конфиг.
0 комментариев