Laravel 4で書かれたWebアプリケーションがあります。このアプリケーションはRatchetを利用しており、具体的にはパッケージを使用しています。ラチェットちなみに、私は以下のテクニックを使用しています。
今、私は次のようなシナリオを得ました:
- Websocket 経由で更新を受け取るスライドショーがあります。
- アプリケーション全体がセットアップされ、ZeroMq を介して PHP から Websocket クライアントに新しいコード変更を公開できます。
私のroutes.phpには、トピックが正しく登録されるように次のコードがあります。
//routes.php // Setup a connection and register a topic where clients can connect to. Latchet::connection('Connection'); Latchet::topic('PhotoStream/{client}', 'PhotoStreamController');
次に、ラチェットサーバーを起動します。
sudo php artisan latchet:listen
写真がアップロードされると、次のコードを実行して、トピックをリッスンしているクライアントに更新をプッシュできます (PhotoStream/client1
この場合は)。
// Create the object, save it to db and then publish it to my websockets
$photo = new Photo;
$photo->location = 'path/to/file';
$photo->save();
// Publish it through my websocket clients. (push from server).
Latchet::publish('PhotoStream/client1', array('msg' => $photo->toArray() ));
このコードはすべて機能しますが、更新の場合です。私の質問は次のとおりです。
クライアントの初期化はどのように処理すればよいですか?
- まず、単純な古い PHP を使用してページをレンダリングし、その後、Websocket クライアントを初期化して、さらに更新 (ある場合) を受信する必要がありますか?
- または、新しい Websocket クライアントを登録するときに、リクエストに追加のパラメータを指定して、サーバーが Websocket 経由で完全なデータを送信するようにする必要がありますか?
2 つのオプションのうち後者が私にとっては最良のオプションのように思えますが、これをどのように適切に実装すればよいのかよくわかりません。
ベストアンサー1
JavaScript 側 (初期リストを取得するため):
//session.subscribe(....)
session.call('route/to/controller', arg1, arg2).then(function(res) {
console.log(res) //initial collection of photos
});
PHP 側 (初期リストを取得するため):
public function call($connection, $id, $topic, $params) {
//the id is needed to be able to trace your async calls back to the right promise
$connection->callResult($id, $this->getInitialPhotosFilteredByParams($params));
});
サブスクライブ経由で更新をすでに正常に取得しているので、必要なのはこれだけです。ただし、XSS には注意してください。パラメータがフィルタリングされない可能性があります。