Блог Vaden Pro

Все о самостоятельном создании и продвижении сайтов

Трансляция событий при помощи Pusher.com и Socket.io в Laravel 5.1

Раздел: 

На днях Тэйлор опубликовал новое видео Laracast в котором рассказывается как пользоваться новым функционалом для трансляции событий в Laravel 5.1, это позволяет, к примеру, просто «транслировать» любое событие из pusher.com или socket.io.

Трансляция событий Laravel

Что такое 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"

Что еще добавилось в Laravel 5.1?