Когда первый раз читаешь доку по 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, хотя виноват твой конфиг.