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

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

17

Решение

Я закончил тем, что использовал мозговое гнездо brainboxlabs (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, При желании вы можете предоставить ему портовое устройство головного мозга: старт 9000

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

В vendor \ 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 в этом руководстве http://www.binarytides.com/websockets-php-tutorial/ .

Дайте мне знать, если кому-то понадобится дополнительная помощь относительно его реализации.

21

Другие решения

Других решений пока нет …