Laravel Echo не слушает только на частном канале

Я пытаюсь прослушивать частный канал с помощью Laravel Echo, но он не прослушивает только частный канал, общедоступный канал работает нормально.

Я также использую пакет yondcode / Laravel-Websockets, и он показывает мне на панели инструментов веб-сокетов все подключения и сделанные события. Он показывает все частные подключения, сделанные самим пакетом, мои общедоступные подключения и все инициированные события (частные и общедоступные), но не показывает мне мои частные подключения.

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

Я попытался понизить свою версию Laravel Echo до версии "^ 1.3.2", когда предопределено было "^ 1.5.4"

Это мое мероприятие laravel, которое транслируется на частном канале

<?php

namespace App\Events;

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;

class NuevoGasto implements ShouldBroadcastNow
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $gasto;

    public function __construct($gasto)
    {
        $this->gasto = $gasto;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('nuevo-gasto-channel');
    }
}

Обратите внимание: я использую типаж ShouldBroadcastNow, поэтому мне не нужно использовать очередь

Это мой файл bootstrap.js с моей конфигурацией Laravel Echo

import Echo from 'laravel-echo'

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

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    wsHost: window.location.hostname,
    wsPort: 6001,
    disableStats: true,
});

Это мой файл routes / channels.php


Broadcast::channel('nuevo-gasto-channel', function ($user) {
    return true;
});

Обратите внимание, я возвращаю true для демонстрационных целей

Это мой файл просмотра, когда я слушаю событие NuevoGasto на nuevo-gasto-channel.


Echo.private('nuevo-gasto-channel')
    .listen('NuevoGasto', (e) => {
            console.log(e);
});

И, наконец, это мой контроллер, в котором я вызываю событие


...

broadcast(new NuevoGasto($gasto))->toOthers();

...

Я не получаю ошибок, просто не слушаю приватный канал


person Alonso Ureña    schedule 23.06.2019    source источник


Ответы (3)


Попробуйте раскомментировать App\Providers\BroadcastServiceProvider::class в своем config/app.php, если вы еще этого не сделали.

person Rron Nela    schedule 26.08.2019

Добавьте точку в событии NuevoGasto

Должно получиться так:

enter code here Echo.private('nuevo-gasto-channel')
.listen('.NuevoGasto', (e) => {
        console.log(e);
});
person Miguel Bastidas    schedule 24.03.2021

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

Как упоминалось здесь, в документации Laravel. Документ

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

Попробуйте использовать прямую отправку событий, как указано здесь Doc


И, пожалуйста, имейте в виду следующее, что касается имени трансляции и пространства имен.

Название трансляции

Как упоминалось здесь, в документации Laravel. Документ

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

/**
 * The event's broadcast name.
 *
 * @return string
 */

public function broadcastAs()
{
    return 'server.created';
}

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

Это проинструктирует Echo не добавлять пространство имен приложения к событию:

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

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

Как упоминалось здесь, вы также можете использовать пространство имен Doc

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

window.Echo = new Echo({
    broadcaster: 'pusher',
    // ...
    namespace: 'App.Other.Namespace'
});

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

Echo.channel('orders')
    .listen('.Namespace\\Event\\Class', (e) => {
        //
    })
person Milind Patel    schedule 13.05.2021