Версія фреймворка: 8.x

Мовлення

Вступ

У багатьох сучасних веб-додатках WebSockets використовуються для реалізації в режимі реального часу оновлюваних користувацьких інтерфейсів. Коли деякі дані оновлюються на сервері, повідомлення, як правило, надсилається через з'єднання WebSocket для обробки клієнтом. Це забезпечує більш надійну та ефективну альтернативу постійному опитуванню вашої програми для внесення змін.

Щоб допомогти вам у створенні таких типів програм, Laravel полегшує "Broadcast" вашихподіїчерез з'єднання WebSocket. Broadcast подій Laravel дозволяє обмінюватися однаковими іменами подій між кодом на стороні сервера та вашим додатком JavaScript на стороні клієнта.

Перш ніж заглибитися в Broadcast подій, переконайтесь, що ви прочитали всю документацію щодо Laravelподії та Listeners.

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

Усі конфігурації Broadcast подій вашої програми зберігаються вconfig/broadcasting.phpфайл конфігурації. Laravel підтримує декілька драйверів мовлення:Канали штовхача,Редіс, і alogдрайвер для місцевого розвитку та Debug. Крім того, anullвключений драйвер, що дозволяє повністю відключити мовлення. Приклад конфігурації наведено для кожного з цих драйверів уconfig/broadcasting.phpфайл конфігурації.

Постачальник послуг Broadcast

Перш ніж транслювати будь-які події, спочатку потрібно зареєструватиApp\Providers\BroadcastServiceProvider. У нових програмах Laravel вам потрібно лише прокоментувати цього постачальника вprovidersмасив вашогоconfig/app.phpфайл конфігурації. Цей постачальник дозволить вам реєструвати маршрути авторизації мовлення та Callbacks.

Токен CSRF

Laravel Echoпотребуватиме доступу до маркера CSRF поточної сесії. Ви повинні перевірити, що ваша програмаheadЕлемент HTML визначає ametaтег, що містить маркер CSRF:

<meta name="csrf-token" content="{{ csrf_token() }}">

Передумови драйвера

Канали Pusher

Якщо ви транслюєте свої подіїКанали штовхача, вам слід встановити PHP SDK Pusher Channels за допомогою менеджера пакетів Composer:

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

Далі слід налаштувати облікові дані каналів уconfig/broadcasting.phpфайл конфігурації. Приклад конфігурації каналів уже включений у цей файл, що дозволяє швидко вказати ключ, секрет та ідентифікатор програми.config/broadcasting.phpфайлівpusherконфігурація також дозволяє вказати додаткові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'
});

Нарешті, вам потрібно буде змінити драйвер мовлення наpusherу вашому.envфайл:

BROADCAST_DRIVER=pusher

Сумісні веб-розетки Laravel

laravel-websockets- це чистий пакет PHP, сумісний з Pusher, для Laravel. Цей пакет дозволяє використовувати всю потужність Broadcast Laravel без зовнішнього постачальника веб-сокетів або Node. Для отримання додаткової інформації щодо встановлення та використання цього пакету, будь ласка, зверніться до йогоofficial documentation.

Редіс

Якщо ви використовуєте мовник Redis, вам слід або встановити розширення phpredis PHP через PECL, або встановити бібліотеку Predis через Composer:

composer require predis/predis

Далі слід оновити драйвер мовлення доredisу вашому.envфайл:

BROADCAST_DRIVER=redis

Телеканал Redis буде транслювати повідомлення за допомогою функції pub / sub Redis; однак вам потрібно буде з'єднати це з сервером WebSocket, який може отримувати повідомлення від Redis і транслювати їх на ваші канали WebSocket.

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

Socket.IO

Якщо ви збираєтеся з'єднати мовника Redis із сервером Socket.IO, вам потрібно буде включити клієнтську бібліотеку Socket.IO у свою програму. Ви можете встановити його через менеджер пакунків NPM:

npm install --save-dev socket.io-client@2

Далі вам потрібно буде створити екземпляр Echo за допомогоюsocket.ioроз'єм та ahost.

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. Laravel не включає реалізацію сервера Socket.IO; проте сервер Socket.IO, керований спільнотою, наразі підтримується наtlaverdure / laravel-echo-serverРепозиторій GitHub.

Передумови черги

Перед Broadcast подій вам також потрібно буде налаштувати та запустити aпрослуховувач черги. Усі Broadcast подій здійснюються через завдання в черзі, так що час відгуку вашої програми серйозно не позначається.

Огляд концепції

Broadcast подій Laravel дозволяє транслювати події Laravel на сервері до вашого додатку JavaScript на стороні клієнта, використовуючи підхід на основі драйверів до WebSockets. В даний час Laravel поставляється зКанали штовхачата драйвери Redis. Події можуть бути легко використані на стороні клієнта за допомогоюLaravel EchoПакет Javascript.

Події транслюються за "каналами", які можуть бути визначені як загальнодоступні чи приватні. Будь-який відвідувач вашої програми може підписатися на загальнодоступний канал без будь-якої автентифікації або дозволу; однак, щоб підписатися на приватний канал, користувач повинен пройти аутентифікацію та авторизуватися для Listening на цьому каналі.

Якщо ви хочете скористатися відкритим кодом, PHP-керованою альтернативою Pusher, перегляньтеlaravel-websocketsпакет.

Використання прикладу програми

Перш ніж заглибитися в кожен компонент Broadcast подій, давайте візьмемо огляд високого рівня, використовуючи приклад магазину електронної комерції. Ми не будемо обговорювати деталі налаштуванняКанали штовхачаабоLaravel Echoоскільки це буде детально обговорено в інших розділах цієї документації.

В нашому додатку, припустимо, у нас є сторінка, яка дозволяє користувачам переглядати статус доставки своїх замовлень. Припустимо також, що aShippingStatusUpdatedподія запускається, коли додаток обробляє оновлення статусу доставки:

event(new ShippingStatusUpdated($update));

ShouldBroadcastІнтерфейс

Коли користувач переглядає одне із своїх замовлень, ми не хочемо, щоб йому потрібно було оновлювати сторінку, щоб переглянути оновлення стану. Натомість ми хочемо транслювати оновлення програми під час їх створення. Отже, нам потрібно позначитиShippingStatusUpdatedподія зShouldBroadcastінтерфейс. Це дасть вказівку Laravel транслювати подію під час її запуску:

<?php

namespace App\Events;

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

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

ShouldBroadcastінтерфейс вимагає, щоб наша подія визначила abroadcastOnметод. Цей метод відповідає за повернення каналів, на яких має транслюватись подія. Порожній заглушка цього методу вже визначена для сформованих класів подій, тому нам потрібно лише заповнити його деталі. Ми хочемо, щоб творець замовлення мав можливість переглядати оновлення стану, тому ми транслюватимемо подію на приватному каналі, пов’язаному із замовленням:

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

Авторизація каналів

Пам’ятайте, користувачі повинні мати дозвіл на Listening на приватних каналах. Ми можемо визначити наші правила авторизації каналу вroutes/channels.phpфайл. У цьому прикладі нам потрібно підтвердити, що будь-який користувач, який намагається прослуховувати приватний звукorder.1канал насправді є творцем замовлення:

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

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

Усі зворотні виклики авторизації отримують поточно автентифікованого користувача як перший аргумент, а будь-які додаткові параметри підстановки - як наступні аргументи. У цьому прикладі ми використовуємо{orderId}заповнювач, щоб вказати, що частина «Ідентифікатор» назви каналу є символом підстановки.

Listening Broadcast подій

Далі, залишається лише прослухати подію в нашому додатку JavaScript. Ми можемо зробити це за допомогою Laravel Echo. Спочатку ми використаємоprivateспосіб підписатися на приватний канал. Тоді ми можемо використовуватиlistenметод ListeningShippingStatusUpdatedподія. За замовчуванням усі загальнодоступні властивості події будуть включені до Broadcast події:

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

Визначення Broadcast подій

Щоб повідомити Laravel про те, що дана подія має транслюватися, застосуйтеIlluminate\Contracts\Broadcasting\ShouldBroadcastінтерфейс класу подій. Цей інтерфейс вже імпортований до всіх класів подій, створених фреймворком, тому ви можете легко додати його до будь-якої з ваших подій.

ShouldBroadcastінтерфейс вимагає реалізації одного методу:broadcastOn.broadcastOnметод повинен повертати канал або масив каналів, на яких подія повинна транслювати. Канали мають бути екземплярамиChannel,PrivateChannel, абоPresenceChannel. ЕкземпляриChannelпредставляти загальнодоступні канали, на які може підписатися будь-який користувачPrivateChannelsіPresenceChannelsпредставляють приватні канали, які вимагаютьавторизація каналу:

<?php

namespace App\Events;

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

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);
    }
}

Тоді вам потрібно лишезвільнити подіюяк зазвичай. Як тільки подію було звільнено, aробота в черзіавтоматично транслюватиме подію за вказаним драйвером мовлення.

Назва Broadcast

За замовчуванням Laravel транслюватиме подію, використовуючи назву класу події. Однак ви можете налаштувати назву Broadcast, вказавши abroadcastAsметод події:

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

Якщо ви налаштовуєте назву Broadcast за допомогоюbroadcastAsметоду, ви повинні переконатись, що зареєстрували свого Listenerа у ведучому.характер. Це дозволить Echo не додавати простір імен програми до події:

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

B Roa d або st

Коли Broadcast події, усі їїpublicвластивості автоматично серіалізуються і транслюються як корисне навантаження події, що дозволяє отримати доступ до будь-яких її загальнодоступних даних із програми JavaScript. Так, наприклад, якщо ваша подія має єдину публіку$userвластивість, яка містить Eloquent модель, корисне навантаження події буде:

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

Однак, якщо ви хочете мати більш чіткий контроль над вашим корисним навантаженням, ви можете додатиbroadcastWithметод до вашої події. Цей метод повинен повертати масив даних, які ви хочете транслювати як корисне навантаження події:

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

Черга Broadcast

За замовчуванням кожна Broadcast події розміщується в черзі за замовчуванням для з'єднання черги за замовчуванням, зазначеного у вашомуqueue.phpфайл конфігурації. Ви можете налаштувати чергу, що використовується мовником, визначивши abroadcastQueueвластивість вашого класу подій. У цій властивості повинно бути вказано назву черги, яку ви хочете використовувати під час Broadcast:

/**
 * 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
{
    //
}

Умови мовлення

Іноді ви хочете транслювати свою подію, лише якщо задана умова відповідає дійсності. Ви можете визначити ці умови, додавши abroadcastWhenметод до вашого класу подій:

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

Авторизація каналів

Приватні канали вимагають від вас дозволу на те, що поточно зареєстрований користувач може насправді слухати канал. Це досягається шляхом надсилання HTTP-запиту до вашої програми Laravel з назвою каналу та надання можливості додатку визначити, чи може користувач слухати на цьому каналі. При використанніLaravel Echo, запит HTTP про авторизацію підписки на приватні канали буде зроблений автоматично; однак вам потрібно визначити правильні маршрути, щоб відповісти на ці запити.

Визначення шляхів авторизації

На щастя, Laravel дозволяє легко визначити маршрути для відповіді на запити авторизації каналу. ВBroadcastServiceProviderвключений до вашої програми Laravel, ви побачите дзвінок до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 or falseвказує, чи дозволено користувачеві прослуховувати канал.

Усі зворотні виклики авторизації отримують поточно автентифікованого користувача як перший аргумент, а будь-які додаткові параметри підстановки - як наступні аргументи. У цьому прикладі ми використовуємо{orderId}заповнювач, щоб вказати, що частина «Ідентифікатор» назви каналу є символом підстановки.

Прив'язка моделі авторизації зворотного виклику

Подібно до HTTP-маршрутів, маршрути каналів також можуть використовувати неявні та явніroute model binding. Наприклад, замість отримання рядка або ідентифікатора числового замовлення ви можете попросити фактичнийOrderпримірник моделі:

use App\Models\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файл може стати громіздким. Отже, замість використання Closures для авторизації каналів, ви можете використовувати класи каналів. Щоб створити клас каналу, використовуйтеmake:channelartisan командування. Ця команда помістить новий клас каналу в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\Models\Order;
use App\Models\User;

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

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

Broadcast подій

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

event(new ShippingStatusUpdated($update));

Тільки іншим

Створюючи додаток, що використовує Broadcast подій, ви можете замінитиeventфункція за допомогоюbroadcastфункція. Подобаєтьсяeventфункція,broadcastфункція передає подію вашим серверним Listenerам:

broadcast(new ShippingStatusUpdated($update));

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

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

Щоб краще зрозуміти, коли вам може знадобитися використовуватиtoOthers, уявімо собі програму списку завдань, де користувач може створити нове завдання, ввівши ім’я завдання. Щоб створити завдання, ваша програма може зробити запит до/taskкінцева точка, яка транслює створення завдання та повертає представлення JSON нового завдання. Коли ваша програма JavaScript отримує відповідь від кінцевої точки, вона може безпосередньо вставити нове завдання у свій список завдань так:

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

Однак пам’ятайте, що ми також транслювали створення завдання. Якщо ваша програма JavaScript прослуховує цю подію, щоб додати завдання до списку завдань, у вашому списку будуть повторювані завдання: одне з кінцевої точки та одне з Broadcast. Ви можете вирішити це за допомогоюtoOthersметод вказівки мовнику не транслювати подію поточному користувачеві.

Ваша подія повинна використовуватиIlluminate\Broadcasting\InteractsWithSocketsриса для того, щоб викликатиtoOthersметод.

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

Коли ви ініціалізуєте екземпляр Laravel Echo, з'єднанню присвоюється ідентифікатор сокета. Якщо ви використовуєтеПереглянутиіАксіос, ідентифікатор сокета буде автоматично приєднаний до кожного вихідного запиту якX-Socket-IDзаголовок. Потім, коли ви телефонуєте наtoOthersметоду, Laravel витягне ідентифікатор сокета із заголовка та дасть вказівку мовнику не транслювати жодні з'єднання з цим ідентифікатором сокета.

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

var socketId = Echo.socketId();

Отримання Broadcast

Встановлення Laravel Echo

Laravel Echo - це бібліотека JavaScript, яка робить безболісним підписку на канали та Listening подій, які транслює Laravel. Ви можете встановити Echo через менеджер пакунків NPM. У цьому прикладі ми також встановимоpusher-jsпакет, оскільки ми будемо використовувати мовник Pusher Channels:

npm install --save-dev laravel-echo pusher-js

Після встановлення Echo ви готові створити новий екземпляр Echo у JavaScript вашого додатка. Чудове місце для цього - внизуresources/js/bootstrap.jsфайл, що входить до фреймворку Laravel:

import Echo from "laravel-echo"

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

При створенні екземпляра Echo, який використовує файлpusherВи також можете вказати aclusterа також про те, чи потрібно з'єднання здійснювати через TLS (за замовчуванням, колиforceTLS is 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
});

Listening подій

Після встановлення та створення екземпляра Echo ви готові розпочати Listening Broadcast подій. По-перше, використовуйтеchannelметод отримати екземпляр каналу, а потім викликатиlistenметод Listening вказаної події:

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

Якщо ви хочете слухати події на приватному каналі, використовуйтеprivateзамість цього. Ви можете продовжувати ланцюгові дзвінки доlistenметод Listening декількох подій на одному каналі:

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

Вихід із каналу

Щоб залишити канал, ви можете зателефонувати доleaveChannelу вашому екземплярі Echo:

Echo.leaveChannel('orders');

Якщо ви хочете залишити канал, а також пов'язані з ним приватні канали та канали присутності, ви можете зателефонувати за номеромleaveметод:

Echo.leave('orders');

Namespaces

Можливо, ви помітили у прикладах вище, що ми не вказали повний простір імен для класів подій. Це тому, що 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) => {
        //
    });

Канали присутності

Канали присутності базуються на безпеці приватних каналів, одночасно виявляючи додаткову функцію обізнаності про те, хто підписаний на канал. Це спрощує створення потужних спільних функцій додатків, таких як Notification користувачів, коли інший користувач переглядає ту саму сторінку.

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

Усі канали присутності також є приватними; тому користувачі повинні бутиуповноважений на доступ до них. Однак при визначенні зворотних викликів для каналів присутності ви не повернетесьtrueякщо користувач уповноважений приєднуватися до каналу. Натомість вам слід повернути масив даних про користувача.

Дані, повернені авторизаційним зворотним викликом, будуть доступні Listenerам подій каналу присутності у вашому додатку JavaScript. Якщо користувач не має права приєднуватися до каналу присутності, вам слід повернутисяfalseабоnull:

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

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

Щоб приєднатися до каналу присутності, ви можете використовувати Echo'sjoinметод.joinметод поверне aPresenceChannelреалізації, яка поряд з викриттям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метод буде виконаний, коли користувач покине канал.

Broadcast на канали присутності

Канали присутності можуть приймати події подібно до державних або приватних каналів. На прикладі чату ми можемо захотіти транслювати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:

broadcast(new NewMessage($message));

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

Ви можете прослухати подію приєднання через Echo'slistenметод:

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

Події клієнта

Під час використанняКанали штовхача, ви повинні ввімкнути опцію "Клієнтські події" у розділі "Налаштування програми" на вашомуінформаційна панель програмидля того, щоб надсилати події клієнта.

Іноді вам може знадобитися транслювати подію для інших підключених клієнтів, взагалі не натискаючи вашу програму Laravel. Це може бути особливо корисно для таких речей, як Notification про "набір тексту", коли ви хочете попередити користувачів своєї програми, що інший користувач вводить повідомлення на даному екрані.

Для Broadcast клієнтських подій ви можете використовувати Echo'swhisperметод:

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

Для Listening подій клієнта ви можете використовуватиlistenForWhisperметод:

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

Повідомлення

З’єднавши Broadcast події зповідомлення, ваш додаток JavaScript може отримувати нові Notification в міру їх появи, не потребуючи оновлення сторінки. По-перше, обов’язково прочитайте документацію щодо використанняканал Notification про Broadcast.

Після того, як ви налаштували Notification для використання Broadcast каналу, ви можете слухати Broadcastні події за допомогою Echo'snotificationметод. Пам’ятайте, назва каналу повинна відповідати назві класу сутності, яка отримує Notification:

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

У цьому прикладі всі Notification надіслані наApp\Models\Userекземпляри черезbroadcastканал отримає зворотний дзвінок. Зворотний виклик авторизації каналу дляApp.Models.User.{id}канал включений за замовчуваннямBroadcastServiceProviderщо поставляється з рамкою Laravel.