Laravel websocket получает ошибку при отправке сообщения от моего JS клиента - PullRequest
0 голосов
/ 05 апреля 2020

Я создаю службу websocket в моей версии приложения Laravel версии 6.2 и использую пакет laravel -websockets версии 1.3 (https://github.com/beyondcode/laravel-websockets).

Итак, все работает нормально, но я настраиваю мой websocket в соответствии с документацией, чтобы переопределить методы onOpen, onClose, onError и onMessage. После этого я тестирую с клиентом все эти методы, и они все еще работают нормально (onOpen, onClose, onError), за исключением метода onMessage, этот последний выполняет следующее исключение:

Exception `ErrorException` thrown: `Undefined property: Ratchet\Server\IoConnection::$app`
Unknown app id: exception `ErrorException` thrown: `Undefined property: Ratchet\Server\IoConnection::$app`.

Я не знаю, что Бывает, но вот мой собственный класс websocket для отлова клиентских событий:

<?php

namespace App\Websocket;

use Ratchet\ConnectionInterface;
use Ratchet\RFC6455\Messaging\MessageInterface;
use Ratchet\WebSocket\MessageComponentInterface;

class Handler implements MessageComponentInterface
{

    public function onOpen(ConnectionInterface $connection)
    {
        // TODO: Implement onOpen() method.
        \Log::debug('ON OPEN');
        // \Log::debug([$connection]);
    }

    public function onClose(ConnectionInterface $connection)
    {
        // TODO: Implement onClose() method.
        \Log::debug('ON CLOSE');
    }

    public function onError(ConnectionInterface $connection, \Exception $e)
    {
        // TODO: Implement onError() method.
        \Log::debug('ON ERROR');
        // \Log::debug([$connection]);
        \Log::debug($e);
    }

    public function onMessage(ConnectionInterface $connection, MessageInterface $msg)
    {
        // TODO: Implement onMessage() method.
        \Log::debug('ON MESSAGE');
    }
}

1 Ответ

0 голосов
/ 06 апреля 2020

Я нашел ответ здесь beyondcode / laravel -websockets проблема # 342 Вы должны создать экземпляр атрибута приложения в методе onOpen, вот код:

<?php

namespace App\Websocket;

use BeyondCode\LaravelWebSockets\Apps\App;
use Ratchet\ConnectionInterface;
use Ratchet\RFC6455\Messaging\MessageInterface;
use Ratchet\WebSocket\MessageComponentInterface;

class Handler implements MessageComponentInterface
{

    public function onOpen(ConnectionInterface $connection)
    {
        // TODO: Implement onOpen() method.
        \Log::debug('ON OPEN');
        $socketId = sprintf('%d.%d', random_int(1, 1000000000), random_int(1, 1000000000));
        $connection->socketId = $socketId;
        $connection->app = App::findById('YOUR_APP_ID');
    }

    public function onClose(ConnectionInterface $connection)
    {
        // TODO: Implement onClose() method.
        \Log::debug('ON CLOSE');
    }

    public function onError(ConnectionInterface $connection, \Exception $e)
    {
        // TODO: Implement onError() method.
        \Log::debug('ON ERROR');
        // \Log::debug([$connection]);
        // \Log::debug($e);
    }

    public function onMessage(ConnectionInterface $connection, MessageInterface $msg)
    {
        $connection->send('Hello World!');
        // TODO: Implement onMessage() method.
        \Log::debug(['ON MESSAGE', $msg]);
    }
}

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

...