2017-03-27 13 views
0

私は、Larvelのダイナミックチャンネルでイベントをブロードキャストします。動的laravelチャンネルに登録する(redis経由で)

特定のチャンネルでブロードキャストするには、this tutorialを試してみましたが、すべて正常に機能しました。

これは私のイベントです:

class ChatNewMessage implements ShouldBroadcast 
{ 
    use InteractsWithSockets, SerializesModels; 

    public $targetUsers; 
    public $message; 

    public function __construct ($message) 
    { 
     $this->targetUsers = $message->chat->users->pluck('user_id'); 
     /*This is an array of user that are subscribed to a chat*/ 

     $this->message  = $message; 
    } 

    public function broadcastOn() 
    { 
     $userChannels = []; 
     foreach ($this->targetUsers as $id) { 
      $userChannels[] = 'user-channel.' . $id; 
     } 

     return $userChannels; 
    } 
} 

そして、これはのuser_id = 5することにより、ユーザのために発生したイベントを取得するためのjsのコードです:

var socketURL = 'http://127.0.0.1:3000'; 

var socket = io(socketURL); 
socket.on('user-channel.5:App\\Events\\ChatNewMessage', function (event) { 
     alert(event.data); 
}); 

そして、これが実行されるjsのコードですノード:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var Redis = require('ioredis'); 
var redis = new Redis(); 

// redis.subscribe('user-channel.5', function (err, count) {}); 
redis.psubscribe('*', function(err, count) {}); 

redis.on('message', function (channel, message) { 
    console.log('Message Received: ' + message); 
    message = JSON.parse(message); 
    io.emit(channel + ':' + message.event, message.data); 
}); 

http.listen(3000, function() { 
    console.log('Listening on Port 3000'); 
}); 

redis.on("error", function (err) { 
    console.log(err); 
}); 

ご覧のとおり、などuser-channel.1user-channel.2user-channel.3などのすべてのチャンネルを購読する。

しかし、それは動作しません。

もちろん、すべてのことがうまくいくように、私はレディスで静的なチャンネル名をredis.subscribe('user-channel.5', function (err, count) {});のように使用しました。

何が問題なのかわかりませんし、動的に作成されたチャンネルをどのように購読できますか?

私はlaravel 5.2を使用しています。

+0

あなたが解決策を把握していますか? –

+0

@MohammadTasneemFaizyab、私は私の質問に答えを加えました。 –

答えて

4

は最後に、私は以下で使用すると、すべての物事がうまく働いた:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var Redis = require('ioredis'); 
var redis = new Redis(); 

redis.psubscribe('*', function(err, count) {}); 

redis.on('pmessage', function(subscribed, channel, message) { 
    console.log(channel); 
    message = JSON.parse(message); 
    io.emit(channel + ':' + message.event, message.data); 
}); 

http.listen(3000, function() { 
    console.log('Listening on Port 3000'); 
}); 

redis.on("error", function (err) { 
    console.log(err); 
}); 
関連する問題