Ответ 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/.
Сообщите мне, если кому-то нужна дополнительная помощь в ее реализации.