@exec0c

Почему не приходят события до клиента в laravel-echo?

Здравствуйте, пытаюсь поднять laravel + websocket всё это в docker.

Всё вроде работает между собой, но на клиенте не приходит событие, что может быть?

Настройки laravel-echo-server.json
{
	"authHost": "backend",
	"authEndpoint": "/broadcasting/auth",
	"clients": [],
	"database": "redis",
	"databaseConfig": {
		"redis": {
			"port": "6379",
			"host": "redis"
		},
		"sqlite": {
			"databasePath": "/database/laravel-echo-server.sqlite"
		}
	},
	"devMode": true,
	"host": null,
	"port": "6001",
	"protocol": "http",
	"socketio": {},
	"secureOptions": 67108864,
	"sslCertPath": "",
	"sslKeyPath": "",
	"sslCertChainPath": "",
	"sslPassphrase": "",
	"subscribers": {
		"http": true,
		"redis": true
	},
	"apiOriginAllow": {
		"allowCors": false,
		"allowOrigin": "",
		"allowMethods": "",
		"allowHeaders": ""
	}
}

App\Events\TestEvent.php
<?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\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class TestEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public function broadcastOn()
    {
        return new Channel('test');
    }
}

Подключаюсь к сокету
import Echo from 'laravel-echo';
window.io = require('socket.io-client');

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

window.Echo.channel('test').listen('TestEvent', e => {
    console.log(e);
});

Что показывает php artisan queue:listen: Скриншот удалён модератором.

Что показывает laravel-echo-server:
1. Скриншот удалён модератором.
2. Скриншот удалён модератором.
Что показывает redis-cli MONITOR: Скриншот удалён модератором.
Вызываю событие в routes/web.php:
Route::get('/fire', function () {
    event(new TestEvent());

    return 'ok';
});
  • Вопрос задан
  • 424 просмотра
Решения вопроса 1
@exec0c Автор вопроса
Изменил версию зависимости в package.json и заработало:
{
    "dependencies": {
        "socket.io-client": "^2.4"
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
pLavrenov
@pLavrenov
Разработка сайтов
На скрине под цифрой 2 видно что пушит в App\Events\TestEvent а слушаешь TestEvent

а для того чтобы этого не было надо читать документацию там написано: чтобы изменить надо добавить метод broadcastAs() который возвращает строку с именем события.

Примерно так минимально должен выглядеть Event
class OrderCreatedEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public Order $order;

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

    public function broadcastOn(): array
    {
        return [
            new Channel('app.orders.list'),
            new Channel('app.orders.list.' . $this->order->uuid),
        ];
    }

    public function broadcastAs(): string
    {
        return 'order.created';
    }

    public function broadcastWith(): array
    {
        return [
            'order' => new OrderResource($this->order),
        ];
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы