Трансляции

Содержание:

Введение

В современных приложениях используются WebSockets для реализации обновления в реальном времени обновления пользовательских веб-интерфейсов. Когда некоторые данные обновляются на сервере, обычно высылается сообщение через соединение WebSocket для обработки клиентом. Это обеспечивает надежный и эффективный подход для отслеживания изменений для вашего приложения.

Чтобы помочь вам в построении таких типов приложений, Laravel делает легким "вещание" ваших событий через соединение WebSocket. Вещание ваших событий Laravel позволяет вам делиться событиями между вашим сервером и клиентом JavaScript приложения.

Перед тем как приступить к подробному изучению вещания, убедитесь в том, что прочитали документацию разделов события и слушатели.

Конфигурация

Вся конфигурация для вещания событий вашего приложения располагается в файле конфигурации config/broadcasting.php. Laravel поддерживает несолько драйверов вещания из коробки: Pusher Channels, Redis, и log для локальной разработки и отладки. Дополнительно, включён драйвер null, который позволяет полностью выключить вещание. Пример конфигурации для каждого драйвера можно найти в файле конфигурации config/broadcasting.php.

Сервис провайдер вещания

Перед вещанием любых событий, вам в первую очередь необходимо зарегистрировать App\Providers\BroadcastServiceProvider. Для нового приложения Laravel, вам всего лишь необходимо раскоментировать этот провайдер в массиве providers для вашего config/app.php файла конфигурации. Этот провайдер позволит вам зарегистрировать маршруты авторизации и обратную связь.

CSRF Токен

Laravel Echo необходимо получения CSRF токена текущей сессии. Вы должны верефицировать, что HTML заголовки вашего приложения head определены в теге meta и содержат CSRF токен:

<meta name="csrf-token" content="pDRQ7oetc7jPPf8CggR1bgQm9RKQr4Og4pE0kNZs">

Требование к драйверу

Каналы Pusher

Если вы проводите вещание событий через каналы Pusher, вам необходимо установить соответсвующее дополнения используя Composer:

composer require pusher/pusher-php-server "~4.0"

После чего, вы должны настроить параметры кананала в файле конфигурации config/broadcasting.php. Пример конфигурации каналов уже приведён в этом файле, что позволяет вам быстро указать ключ каналов, секрет и идентификатор приложения. Настройа pusher файла config/broadcasting.php позволяет вам добавить дополнительные options, которые поддерживаются каналами, такие как кластер:

'options' => [
    'cluster' => 'eu',
    'useTLS' => true
],

При использовании Каналов и Laravel Echo, вы должны указать pusher как желаемого вещателя при установке экземпляра Echo в вашем файле resources/js/bootstrap.js:

import Echo from "laravel-echo";

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-channels-key'
});

Redis

Чтобы использовать Redis, вам необходимо установить библиотеку Predis:

composer require predis/predis

Redis будет выводить сообщения оспользуя свойство pub / sub; Однако, вам потребуется связать это с сервером WebSocket, который может принимать сообщения от Redis и транслировать их по вашим WebSocket каналам.

Когда вещатель Redis публикует событие, оно будет опубликовано на указанных им каналах, нагрузка будет представлена в формате закодированной строки JSON, которая содержит имя события, нагрузка data, и пользователя, который сгенерировал идентификатор сокета события (если возможно).

Socket.IO

Если вы собираетесь связать вещатель Redis с сервером Socket.IO, вам потребуется включить библиотеку JavaScript Socket.IO в ваше приложение. Установить ее можно через NPM менеджер:

npm install --save socket.io-client

После, вам будет необходимо созлдать экземпляр Echo с помощью соединителя socket.io и host.

import Echo from "laravel-echo"

window.io = require('socket.io-client');

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});

Наконец, вам необходимо запустить сервер Socket.IO. Ларавел не включает реализацию сервера Socket.IO; Однако есть сервер поддерживаемый сообществом на репозитории GitHub tlaverdure/laravel-echo-server.

Предварительные условия очереди

Перед вещанием событий, вам также потребуется настроить и запустить слушателей очереди. Вещание всех событий происходит через очередь заданий, поэтому время ответа вашего приложения не будет подвергнуто серьёзному влиянию.


Обзор концепции

Вещание событий Laravel позволяет вам передавать события со стороны сервера на сторону клиента используя подход основанный на драйверах к WebSockets. На текущий момент, Laravel включает Pusher Channels и Redis драйверы. События могут легко потребляться на стороне клиента используя Laravel Echo Javascript компонент.

События вещаются по каналам, которые могут быть указаны как публичные или частные. Любой посетитель вашего приложения может подписаться на публичный канал без любой аутентификации или аторизации. Но для того, чтобы подписаться на частный канал, пользователь должен быть аутентифицирован или авторизован для прослушки этого канала.

Использовать типовое приложение

Перед тем, как подробно рассматривать каждый компонет трансляции собития, давайте сделаем обзор используя интернет-магазин в качестве примера. Мы не будем обсуждать детали конфигурации канало Pusher или Laravel Echo, в силу того, что эти вопросы подробно обсуждались в других секция документации.

В нашем приложении, давайте представим, что у нас есть страница, которая позволяет пользователям просматривать статус их заявок. Также давайте представим, что событие ShippingStatusUpdated запускается при обновлении статуса заявки приложенимем:

event(new ShippingStatusUpdated($update));

Интерфейс ShouldBroadcast

При просмотре пользователем одной из их заявок, мы не хотим, чтобы пользователь перезагружал страницу при обновлении статуса заявки. Вместо этого, мы хотели бы транслировать обновления при их появлении. Поэтому, давайте пометим ShippingStatusUpdated событие с интерфейсом ShouldBroadcast. Это позволит Ларавел вещать событие при его запуске:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class ShippingStatusUpdated implements ShouldBroadcast
{
    /**
     * Information about the shipping status update.
     *
     * @var string
     */
    public $update;
}

Интерфейс ShouldBroadcast требует событие для того, чтобы определить метод broadcastOn. Этот метод несёт ответственность за возвращение каналов, на которые должно вещаться событие. Заглушка метода будет определена при генерации классов события, поэтому на льшь необхдимо наполнить содержимым. Нам лишь нужно, чтобы создатель заявки мог просматривать статус обновлений, поэтому мы будем транслировать событие по частному каналу, который привязан к заказу:

/**
 * Get the channels the event should broadcast on.
 *
 * @return \Illuminate\Broadcasting\PrivateChannel
 */
public function broadcastOn()
{
    return new PrivateChannel('order.'.$this->update->order_id);
}

Авторизованные каналы

Стоит напомнить, что пользователь должен быть авторизирован для прослушки частных каналов. Мы можем определить наши правила канала авторизации в файле routes/channels.php. В этом примере, нам необходимо верефицировать, что любой пользователь, который пытается прослушать канал, является создателем заявки:

Broadcast::channel('order.{orderId}', function ($user, $orderId) {
    return $user->id === Order::findOrNew($orderId)->user_id;
});

Метод channel принимает 2 аргумента: имя канала и обратную связь, которая возвращает true или false в зависимости от того, что пользователь авторизован для прослушки канала.

Вся обратная связь авторизации получает текущего аутентифицированного пользователя в качестве первого аргумента и любые дополнительные параметры в качестве последующих аргументов. В этом примере, мы используем заменитель {orderId}, чтобы показать, что часть имени канала "ID" это специальный символ.

Прослушка вещаний события

Следующее, все что требуется — это ожидать событие в приложении JavaScript. Мы можем это сделать используя Laravel Echo. Во-первых, мы будем использовать метод private для подписки на частный канал. После, мы можем использовать метод listen для события ShippingStatusUpdated. По умолчанию, все публичные свойства события будут включены на вещании события:

Echo.private(`order.${orderId}`)
    .listen('ShippingStatusUpdated', (e) => {
        console.log(e.update);
    });

Определение событий вещаний

Для информирования Ларавел, что данное событие должно вещаться, реализуйте интерфейс Illuminate\Contracts\Broadcasting\ShouldBroadcast для класса события. Этот интерфейс уже импортирован во все классы события сгенерируемые фреймворком, поэтому вы можете легко добавить его для любого вашего события.

Интерфейс ShouldBroadcast требует от вас расширения одиночного метода broadcastOn. Этот метод должен возвращать канал или массив каналов, которые должны транслироваться. Каналы должны быть экземпляром Channel, PrivateChannel, или PresenceChannel. Экземпляр Channel представляет публичные каналы, на которые может подписаться любой пользователь, в то время как PrivateChannels и PresenceChannels представляют частные каналы, для которые требуют авторизацию канала:

<?php

namespace App\Events;

use App\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class ServerCreated implements ShouldBroadcast
{
    use SerializesModels;

    public $user;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('user.'.$this->user->id);
    }
}

После, вам лишь нужно запустить событие, как вы и делаете обычно. После запуска события, задача в очереди автоматически будет транслировать событие по указанному вами каналу.

Вещание имени

По умолчанию, Ларавел будет вещать событие используя имя класса события. Однако, вы можете настроить имя вещания путём определения метода broadcastAs для события:

/**
 * The event's broadcast name.
 *
 * @return string
 */
public function broadcastAs()
{
    return 'server.created';
}

Если вы настраиваете имя вещания используя метод broadcastAs, вам необходимо обязательно зарегистрировать вашего слушателя с ведущим символом .. Это научит Echo не добавлять пространство имён приложению:

.listen('.server.created', function (e) {
    ....
});

Вещание данных

Во время трансляции события, все его публичные public свойства автоматически сериализуются и транслируются в качестве полезной нагрузки события, что позволяет вам получить доступ к любым публичным данным из вашего приложения JavaScript. Поэтому, например, если ваше событие имеет одно публичное свойство $user, которое содержит модель Eloquent, полезная нагрузка вещания события будет: When an event is broadcast, all of its public properties are automatically serialized and broadcast as the event's payload, allowing you to access any of its public data from your JavaScript application. So, for example, if your event has a single public $user property that contains an Eloquent model, the event's broadcast payload would be:

{
    "user": {
        "id": 1,
        "name": "Patrick Stewart"
        ...
    }
}

Однако, если вы хотите иметь больше контроля над полезной нагрузкой вещания, вы можете добавить метод вашему событию broadcastWith. Этот метод должен вернуть массив данных, которые вы желаете транслировать в качестве полезной нагрузки:

/**
 * Get the data to broadcast.
 *
 * @return array
 */
public function broadcastWith()
{
    return ['id' => $this->user->id];
}

Вещание очередей

По умолчанию, какждое событие вещания размещается в типовую очередь для типового соединения очереди, указанном в файле конфигурации queue.php. Вы можете настроить очередь используемую вещателем путём определения свойства broadcastQueue для вашего класса события. Это свойство должно указать имя очереди, которую вы хотите использовать во время вещания:

/**
 * The name of the queue on which to place the event.
 *
 * @var string
 */
public $broadcastQueue = 'your-queue-name';

Если вы хотите вещать ваше событие используя очередь sync вместо драйвера очереди по умолчанию, вы можете расширить интерфейс ShouldBroadcastNow вместо ShouldBroadcast:

<?php

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

class ShippingStatusUpdated implements ShouldBroadcastNow
{
    //
}

Вещание условий

Иногда вы можете захотеть вещать ваше событие только если данное условие верно. Вы можете определить эти условия путём добавления метода broadcastWhen в класс вашего события:

/**
 * Determine if this event should broadcast.
 *
 * @return bool
 */
public function broadcastWhen()
{
    return $this->value > 100;
}

Авторизированные каналы

Частные каналы требуют, чтобы вы разрешили, чтобы текущий аутентифицированный пользователь действительно мог прослушать канал. Это достигается путём выполнения запроса HTTP на ваше приложение Laravel с именем канала и позволению вашегму приложению определять, что пользователь может слушать канал. При использовании Laravel Echo, запрос HTTP на авторизацию подписок на частные каналы будет сделан автоматически. Однако, вам будет необходимо определить маршруты для ответа на данные запросы.

Определение маршрутов авторизации

Laravel делает вопрос определения маршрутов для ответа авторизации каналов очень легким. Во включенном в приложение Laravel файле BroadcastServiceProvider, вы увидите вызов метода Broadcast::routes. Этот метод зарегистрирует марушрут /broadcasting/auth для обработки запросов авторизации:

Broadcast::routes();

Метод Broadcast::routes будет автоматически размещать эти маршруты внутри группы посредников web. Однако, вы можете передавать массив параметров маршрута в метод если вы хотите настроить приписанные атрибуты:

Broadcast::routes($attributes);

Настройка конечной точки авторизации

По умолчанию, Echo будет использовать /broadcasting/auth в качестве финальной точки для авторизации канала доступа. Тем не менее, вы можете указать вашу собственную точку выхода авторизации путём передачи опции конфигурации authEndpoint в экземпляр Echo:

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-channels-key',
    authEndpoint: '/custom/endpoint/auth'
});

Определение обратной связи канала

Следующим шагом нам необходимо определить логику, которая и будет проводить авторизацию канала. Этот уже сделано в файле routes/channels.php, который включён в состав вашего приложения. В этом файле, вы можете использовать метод Broadcast::channel для регистрации обратной связи авторизации:

Broadcast::channel('order.{orderId}', function ($user, $orderId) {
    return $user->id === Order::findOrNew($orderId)->user_id;
});

Метод channel принимает два аргумента: имя канала и обратную связь, которая возвращает true или false в зависимости от того, что пользователь авторизован для прослушки канала или нет.

Через обратную связь авторизации мы получаем текущего аутентифицированного пользователя в качестве первого аргумента и любые дополнительные параметры в качестве их последующих аргументов. В этом примере, вы используем заменитель {orderId}, чтобы показать, что "ID" часть имени канала это маска.

Привязка моделлей обратной связи авторизации

Как и в случае с маршрутами HTTP, маршруты каналов могут также воспользоваться преимуществом явной и неявной связи модели маршрута. Например, вместо получения строки или числового ID, вы можете запросить экземпляр модели фактического заказа Order:

use App\Order;

Broadcast::channel('order.{order}', function ($user, Order $order) {
    return $user->id === $order->user_id;
});

Авторизация обратная связь аутентификации

Частные и не только каналы вещания аутентифицируют текущего пользователя с помощью базовых стражей аутентификации вашего приложения. Если пользователь не аутентифицирован, авторизация канала автоматически будет отклонена и обратная связь авторизации не будет выполняться. Однако, вы можете приписать несколько пользовательских стражей, которые должны провести аутентификацию входящего запроса, если это необходимо:

Broadcast::channel('channel', function() {
    // ...
}, ['guards' => ['web', 'admin']]);

Определение классов канала

Если ваше приложение использует много различных каналов, ваш файл routes/channels.php стать слишком большим. Поэтому, вместо использования замыкания для авторизации каналов, вы можете использовать классы канала. Для генерации класса канала, используйте команду Artisan make:channel. Эта команда разместит новый класс канала в директорию App/Broadcasting.

php artisan make:channel OrderChannel

Следующим шагом зарегистрируйте канал в вашем routes/channels.php файле:

use App\Broadcasting\OrderChannel;

Broadcast::channel('order.{order}', OrderChannel::class);

Наконец, вы можете разместить логику авторизации для вашего канала в метод join класс канала. Метод join будет размещать логику, которую вы бы обычно размещали в замыкании авторизации канала. Вы можете также воспользоваться преимуществом связывания модели канала:

<?php

namespace App\Broadcasting;

use App\User;
use App\Order;

class OrderChannel
{
    /**
     * Create a new channel instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Authenticate the user's access to the channel.
     *
     * @param  \App\User  $user
     * @param  \App\Order  $order
     * @return array|bool
     */
    public function join(User $user, Order $order)
    {
        return $user->id === $order->user_id;
    }
}
Как и много других классов в Ларавел, классы канала будут автоматически использоваться через сервис контейнеры. Поэтому, вы можете вписать любые зависимости, которые требуются вашим каналом в его конструкторе.

Вещание событий

После того, как вы определили событие и отметили его с ShouldBroadcast интерфейсом, вам всего лишь необходимо запустить событие используя функцию event. Диспетчер событий заметит, что событие с пометкой интерфейса ShouldBroadcast и поставит событие в очередь для вещания:

event(new ShippingStatusUpdated($update));

Только другим

При построении приложения, которое использует вещание события, вы можете заменить функцию event на функцию broadcast. Также как и функция event, функция broadcast отправляет событие вашим слушателям на стороне сервера:

broadcast(new ShippingStatusUpdated($update));

Однако, функция broadcast также подвергает метод toOthers, который позволяет вам исключить текущего пользователя из получателей трансляции:

broadcast(new ShippingStatusUpdated($update))->toOthers();

Для лучшего понимания, когда вы можете захотеть использовать метод toOthers, давайте вообразим список заданий приложения, где пользователь может создать новое задание путём ввода имени задания. Для создания задания, ваше приложение может сделать запрос в точку /task, которая транслирует создание задания и возвращает JSON-представление нового задния. Когда ваше JavaScript приложение получает ответ из конечной точки, оно может напрямую вставить новое задание в список заданий таким образом:

axios.post('/task', task)
    .then((response) => {
        this.tasks.push(response.data);
    });

Однако, нужно понимать, что мы транслируем и создание задания. Если ваше приложение JavaScript слушает это событие для добавления задания в списко заданий, вы получите дубликат задания: одно из конечной точки и второе из трансляции. Вы можете решить это используя метод toOthers, чтобы научить вещателя не транслировать событие текущему пользователю.

Ваше событие должно использовать Illuminate\Broadcasting\InteractsWithSockets трейт для того, чтобы обратиться к методу toOthers.

Конфигурация

При инициации экземпляра Laravel Echo, к соединению приписывается идентификатора сокета. Если вы используете Vue и Axios, соект идентификатора будет автоматически присоединён к каждому исходящему запросу как заголовок X-Socket-ID. После, при вызове метода toOthers, Laravel будет извлекать сокет из заголовка и научит вещателя не транслировать всем соединениям с этим идентификатором.

Если вы не используете Vue и Axios, вам потребуется вручную настроить ваше приложение JavaScript и высылкать заголовок X-Socket-ID. Вы можете получить идентификатор сокета используя метод Echo.socketId:

var socketId = Echo.socketId();

Получение вещания

Установка Laravel Echo

Laravel Echo — это JavaScript библиотека, которая делает безболезненным подпись на канала и прослушку событий транслируемых Laravel. Вы можете установить Echo через менеджер пакетов NPM. В этом примере, мы также установим компонент pusher-js в силу того, что мы будем использовать вещатель каналов Pusher:

npm install --save laravel-echo pusher-js

После установки Echo, вы готовы создать новый объект Echo в вашем приложении JavaScript. Для этого есть отличное место внизу файла resources/js/bootstrap.js, который включен в состав фреймворка Ларавел:

import Echo from "laravel-echo"

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-channels-key'
});

При создании экземпляра Echo, который использует соединение pusher, вы также можете указать cluster, также как и необходимо ли устанавливать соединение по протоколу TLS (по умолчанию, forceTLS значение false), не TLS соединение будет выполнено, если страница была загружена по протоколу HTTP, или в качестве запасного варианта, если соединение TLS не работает:

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-channels-key',
    cluster: 'eu',
    forceTLS: true
});

Использование существующего экземпляра клиента

Если вы уже имеете экземпляры клиента Pusher Channels или Socket.io, которые вы бы хотели исопльзовать в Echo, вы можете передать в Echo через опцию конфигурации client:

const client = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-channels-key',
    client: client
});

Прослушивание событий

После установки и создания экземпляра Echo, вы готовы начать прослушивать трансляцию событий. Во-первых, используйте метод channel для получения экземпляра канала, после вызовите метод listen для прослушки конкретного события:

Echo.channel('orders')
    .listen('OrderShipped', (e) => {
        console.log(e.order.name);
    });

Если вы хотите прослушивать события частного канала, используйте метод private. Вы можете продолжать вызывать цепочкой метод listen для прослушки нескольких событий на одном канале:

Echo.private('orders')
    .listen(...)
    .listen(...)
    .listen(...);

Покинуть канал

Чтобы покинуть канал, вы можете вызвать метод leaveChannel для вашего экземпляра Echo:

Echo.leaveChannel('orders');

Если вы хотите покинуть канал и также связанные частные и другие каналы, вы можете вызвать метод leave:

Echo.leave('orders');

Пространство имён

Вы могли заметить, что в примерах выше, мы не указывали полное пространство имён для классов события. Это потому, что Echo автоматически принимает события расположенные в App\Events пространстве. Однако, вы может настроить корневое пространство имён, когда вы создаёте экземпляр Echo путём передачи опции конфигурации namespace:

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-channels-key',
    namespace: 'App.Other.Namespace'
});

Как альтернатива, вы можете добавить префикс классам события с помощью ., при подписке на них используя Echo. Это позволит вам всегда указывать полное имя класса:

Echo.channel('orders')
    .listen('.Namespace\\Event\\Class', (e) => {
        //
    });

Каналы присутствия

Каналы присутствия построены на безопасности частных каналов, в то же время предоставляя преимущества понимание того, кто подписан на канал. Это позволяет легко делать мощные приложения с богатым функционалом, который позволяет информировать пользователей, когда другой пользователь просматривает одну и ту же страницу.

Авторизация в каналах присутствия

Все каналы присутсвия являются частными каналами. Поэтому, пользователи должны быть авторизованы для доступа к ним. Однако, при определении обратной связи авторизации для каналов присутсвия, вам не вернут true, если пользователь авторизован, чтобы присоединиться к каналу. Вместо этого, вы должны вернуть массив данных о пользователе.

Данные, которые возвращаются через обратную связь приложения, станут доступными для слушателей события канала присутствия в вашем приложении JavaScript. Если пользователь не авторизован, чтобы присоединиться к каналу присутствия, вы должны вернуть false или null:

Broadcast::channel('chat.{roomId}', function ($user, $roomId) {
    if ($user->canJoinRoom($roomId)) {
        return ['id' => $user->id, 'name' => $user->name];
    }
});

Присоединене к каналу присутсвия

Чтобы присоединиться к каналу присутсвия, вы можете использовать метод Echo join. Метод join вернёт реализацию PresenceChannel, которая наряду с методом listen, позволяет вам подписаться на события here, joining, и leaving

Echo.join(`chat.${roomId}`)
    .here((users) => {
        //
    })
    .joining((user) => {
        console.log(user.name);
    })
    .leaving((user) => {
        console.log(user.name);
    });

Обратная связь here будет выполнена мгновенно после успешного присоединения к каналу. Будет получен массив, содержащий информацию пользователя для остальных пользователей, подписанных на канал в данных момент. Метод joining будет выполнен, когда новый пользователь присоединяется к каналу, в то время как метод leaving выполняется когда пользователь покидает канал.

Вещание на каналы присутсвия

Каналы присутсвия могут получать события также как и публичные или частные каналы. Используя пример комнаты с чатом, мы можем захотеть транслировать события NewMessage в комнату канала присутствия. Чтобы это сделать, мы вернём экземпляр PresenceChannel из метода события broadcastOn:

/**
 * Get the channels the event should broadcast on.
 *
 * @return Channel|array
 */
public function broadcastOn()
{
    return new PresenceChannel('room.'.$this->message->room_id);
}

Как публичные или частные каналы, каналы присутсвия могут транслироваться используя функцию broadcast. Как и в случае с остальными событиями, вы можете использовать метод toOthers, чтобы исключить текущего пользователя из получателей трансляции:

broadcast(new NewMessage($message));

broadcast(new NewMessage($message))->toOthers();

Вы можете ждать входящие события через метод Echo listen:

Echo.join(`chat.${roomId}`)
    .here(...)
    .joining(...)
    .leaving(...)
    .listen('NewMessage', (e) => {
        //
    });

Клиентские события

При использовании каналов Pusher, вам необходимо включить опцию "Клиентски события (Client Events)" в секции "Настроки приложения (App Settings)" в панели приложения для того, чтобы высылать события клиенту.

Иногда вы можете захотеть транслировать событие другим клиентам на связи без затрагивания вашего приложения Laravel вообще. Это может быть особенно полезным для таких как, уведомления о том, что пользователь пишет сообщение, когда вы хотите рассказать об этом другим пользователям.

Для трансляции событий клиента, вы можете использовать метод Echo whisper:

Echo.private('chat')
    .whisper('typing', {
        name: this.user.name
    });

Для прослушки событий клиента, вы можете использовать метод listenForWhisper:

Echo.private('chat')
    .listenForWhisper('typing', (e) => {
        console.log(e.name);
    });

Уведомления

Связывая трансляцию события с уведомлениями, ваше приложение JavaScript может получать новые уведомления в силу того, что они происзодят без необходимости перезагружать страницу. Во-первых, необходимо полностью изучить информацию использования уведомления в трансляцих.

После того, как вы настроили уведомления, чтобы использовать на трансляции канала, вы можете слушать трансляцию событий используя метод Echo notification. Надо запомнить, что имя канала должно соответсвовать имени класса субъекта, получающего уведомления:

Echo.private(`App.User.${userId}`)
    .notification((notification) => {
        console.log(notification.type);
    });

В этом примере, все уведомления отосланые экземпляру App\User через канал broadcast будут получены через обратную связь. Обратная связь авторизации для канала App.User.{id} включена в стандартный BroadcastServiceProvider, который поставляется с фреймворком Laravel.