web-dev-qa-db-ja.com

laravel 5での単純なwebsocket実装

クライアントとしてのphonegapアプリとサーバーとしてのLaravelウェブサイト間のデータ同期プロセスを実装するには、Laravelに非常にシンプルで非常に基本的なwebsocketを実装する必要があります。私はこのチュートリアルに従いました http://www.binarytides.com/websockets-php-tutorial/ websocketを実装してテストすると動作します。このように、jsクライアントからコントローラーメソッドを呼び出すことができる非常に簡単なlaravel実装が必要です。クライアントはphonegapアプリケーションになります。チュートリアルでlaravelにwebsocketのパッケージをいくつか見つけましたが、実装が難しいと感じました。コントローラーと対話する人はいませんでした。コントローラーを使用せずに、イベントをリッスンし、あちこちでクラスを作成していました。すべてのロジックをコントローラーで作成し、ajaxリクエストでテストしましたが、同期プロセスを実装するには双方向通信が必要なため、websocketで実装します。私はLaravelが初めてなので、助けてください。また、クライアントがデータを送信するためにコントローラーを直接呼び出すことができるように、誰かがlaravelのaboutチュートリアルを統合する方法を教えてくれるととても素晴らしいです。

19
Hassan Dad Khan

結局、brainboxlabsのbrainsocket( https://github.com/BrainBoxLabs/brain-socket )を使用することになりました。その文書では、laravel 4パッケージですが、laravel 5でも問題なく動作します。

このパッケージをlaravel 5.でインストールするにはそのイベント関連のコードをapp/Providers/EventServiceProvider.phpファイルに追加します。そのbootメソッドで、

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。

OK、Webソケットが実装されました。コマンドartisan brainsocket:startを実行して、cmdを使用してwebsocketサーバーを起動することでテストできます。オプションで、ポート職人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/ .

実装に関して誰か他に助けが必要かどうか教えてください。

23
Hassan Dad Khan