На днях Тэйлор опубликовал новое видео Laracast в котором рассказывается как пользоваться новым функционалом для трансляции событий в Laravel 5.1, это позволяет, к примеру, просто «транслировать» любое событие из pusher.com или socket.io.
Что такое pusher.com и socket.io?
Это инструменты, которые используют веб-сокеты для открытия прямого соединения с Вашим пользовательским браузером, что дает возможность передать события непосредственно пользователю без перезагрузки его представления страницы.
Если Вы были на странице и увидели сообщение о событии (к примеру, когда Laravel Forge обновляет статус Вашего сервера без перезагрузки текущей страницы), то скорее всего это и было использование веб-сокета для открытия соединения между Вашим браузером и каким-то сервером. Pusher.com базируется на SaaS, что делает его установку очень легкой, но при желании Вы можете также настроить Ваш собственный сервер воспользовавшись socket.io.
Как работают веб-сокеты?
Я не буду тут обсуждать большинство технических деталей, но Вы должны знать: открывается прямая связь между браузером и бекенд сервером. Сервер может вставлять «events» (у каждого из которых есть имя и, по желанию, прочая полезная информация) через «channels». Так, к примеру, Forge может иметь «server-status» канал, который может вставлять события при каждом изменении состояния сервера.
Так что если вы установили pusher.com для работы с веб-сокетами, вы можете установить Javasctipt клиент на фонтенд, и после использовать Pusher PHP SDK для вставки событий с Вашего сервера на Pusher.com, который передаст их затем клиенту.
Что же такое трансляция событий в Laravel?
Если Вы ранее не работали с событиями в Laravel 5, почитайте информацию по этой тематике.
Итак, мы знаем, что мы можем запускать события в Forge, к примеру пусть это будет событие ServerUpdated.
// ServerControllerOrSomething.php public function update() { // Do updating stuff… // Now send event event(new ServerUpdated($server)); }
В прошлом, если Вы хотели вставить уведомление для пользователей через веб-сокет здесь, Вам было необходимо вытянуть из Pusher SDK и в ручную послать уведомление через pusher.com воспользовавшись обработчиком событий.
Сейчас же Вы просто добавляете пару вещей к Вашему событию: ShouldBroadcast интерфейс и broadcastOn метод.
Подготавливаем Ваши события для трансляции
Попробуйте этот код:
<?php use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class ServerUpdated implements ShouldBroadcast { public $server; public function __construct($server) { $this->server = $server; } public function broadcastOn() { return ['server-updates']; } }
Как Вы могли заметить, broadcastOn метод просто возвращает обратно массив, и как не сложно догадаться после наших предыдущих рассуждений, этот массив является списком всех Pusher каналов в которые мы хотим транслировать это событие.
Payload
Каждое публичное свойство в Вашем событии будет отправляться как часть Pusher payload. Защищенные или приватные свойства совместно отправленны не будут.
Обратите внимание, что мы передали Eloquent объект $server на наш; поскольку объекты Eloquent являются JSONable, $server будет конвертирован в JSON и доставлен с payload.
Используем события в коде на стороне клиента
Вы захотите последовать указаниям Pusher, чтобы получить рабочий код на стороне клиента, но в итоге Вы получите что-то вроде этого:
var serverChannel = pusher.subscribe('server-status'); serverChannel.bind('ServerUpdated', function(message) { console.log(message); // Full payload });
Конфигурация
Также появился новый конфигурационный файл config/broadcasting.php, который позволяет настроить Ваши соединения и способы использования всех составляющих.
Тремя возможными драйверами сейчас являются Pusher.com, Socket.io, и log, который просто записывает локальный log файл для тестирования:
[2015-04-28 20:00:00] local.INFO: Broadcasting [ServerUpdated] on channels [server-status] with payload: { "server": { "id": 1 } }
Выводы
Препятствий для добавления веб-сокетов в Ваше приложение сейчас становится все меньше. Настраиваете трансляцию событий, вставляете ее в pusher.com аккаунт, передаете в Pusher клиент на фонтенд и пользуетесь!
Перевод Matt Stauffer "Broadcasting events with Pusher.com & Socket.io in Laravel 5.1"