Простая реализация websocket в laravel 5

Мне нужно внедрить очень простой и очень простой websocket в Laravel, чтобы реализовать процесс синхронизации данных между моим приложением phonegap как клиентом и моим веб-сайтом Laravel в качестве сервера. Я выполнил этот учебник http://www.binarytides.com/websockets-php-tutorial/ для реализации и тестирования websocket, и он работает. Как и этот, мне нужна очень простая реализация laravel, где я могу вызвать свой метод контроллера из js-клиента. Клиент будет моим телефоном. Я нашел несколько пакетов для websocket в laravel с учебниками, но мне было сложно их реализовать. Никто не взаимодействовал с контроллерами, они слушали события и создавали классы здесь и там, но не в контроллерах. Я написал всю свою логику в контроллере и протестировал его с помощью ajax-запроса, но теперь я буду реализовывать его с помощью websocket, потому что мне нужна двунаправленная связь для реализации процесса синхронизации. Я новичок в Laravel, поэтому, пожалуйста, предоставьте мне некоторую помощь. Также будет так здорово, если кто-нибудь сможет рассказать мне, как интегрировать учебник в laravel так, чтобы клиент мог напрямую вызвать контроллер для отправки данных.

Ответы

Ответ 1

Я закончил использование brainboxlabs brainsocket (https://github.com/BrainBoxLabs/brain-socket). Поскольку в его документе говорится о его пакете laravel 4, но он также работает с laravel 5 без каких-либо проблем.

Чтобы установить этот пакет с laravel 5. Следуйте документации по вышеуказанной ссылке github. Где говорится о создании файла event.php в папке приложения и некоторых связанных с событиями кодах. Вместо этого шага просто добавьте этот код, связанный с событиями, в файл app/Providers/EventServiceProvider.php. В методе загрузки добавьте код

Event::listen('generic.event',function($client_data){
    return BrainSocket::message('generic.event',array('message'=>'A message from a generic event fired in Laravel!'));
});

Event::listen('app.success',function($client_data){
    return BrainSocket::success(array('There was a Laravel App Success Event!'));
});

Event::listen('app.error',function($client_data){
    return BrainSocket::error(array('There was a Laravel App Error!'));
});

После этого шага был добавлен шаг

require app_path().'/filters.php';
require app_path().'/events.php';

в app/start/global.php. Вы можете оставить этот шаг для laravel 5.

Итак, веб-сокет был реализован. Вы можете протестировать, запустив сервер websocket с помощью cmd, выполнив команду artisan brainsocket:start. Вы можете опционально предоставить ему портфолио мастеров порта: start 9000

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

В вендоре \brainboxlabs\brain-socket\src\BrainSocket\BrainSocketServer.php я отредактировал код в методе "start" и заменил

$this->server = IoServer::factory(
            new HttpServer(
                new WsServer(
                    new BrainSocketEventListener(
                        new BrainSocketResponse(new LaravelEventPublisher())
                    )
                )
            )
            , $port
        );

с

$this->server = IoServer::factory(
            new HttpServer(
                new WsServer(
               new \FMIS\Http\Controllers\SynchronizationController(
                  new BrainSocketResponse(new LaravelEventPublisher())
                                            )
                )
            )
            , $port
        );

И в моем файле SynchronizationController.

Я добавил это сверху

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use BrainSocket\BrainSocketResponseInterface;

Реализован такой интерфейс.

class SynchronizationController extends Controller implements MessageComponentInterface{

и реализованы методы этого интерфейса.

public function __construct(BrainSocketResponseInterface $response) {
        $this->clients = new \SplObjectStorage;
        $this->response = $response;
}

public function onOpen(ConnectionInterface $conn) {
        echo "Connection Established! \n";
}


public function onMessage(ConnectionInterface $conn, $msg){
 echo "this messge gets called whenever there is a messge sent from js client";
}

public function onClose(ConnectionInterface $conn) {
    echo "Connection {$conn->resourceId} has disconnected\n";
}

public function onError(ConnectionInterface $conn, \Exception $e) {
        $msg = "An error has occurred: {$e->getMessage()}\n";
        echo $msg;
        $conn->close();
}

Вы должны изменить эти методы для реализации своей функциональности. После этого вы можете позвонить из своего js-клиента. И вы не обязаны использовать его библиотеку js. Вы просто отправляете данные с помощью js client, описанных в этом учебнике http://www.binarytides.com/websockets-php-tutorial/.

Сообщите мне, если кому-то нужна дополнительная помощь в ее реализации.