0
我想在larvel的動態頻道上廣播一個事件。通過redis訂閱動態laravel頻道
要在特定頻道上播放,我試過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;
}
}
這是js代碼獲得通過USER_ID = 5爲用戶發生的事件:
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);
});
正如你所看到的我使用redis.psubscribe('*', function(err, count) {});
訂閱所有頻道如user-channel.1
,user-channel.2
,user-channel.3
等。
但這並不奏效。
當然,當我在redis上使用靜態通道名稱(如redis.subscribe('user-channel.5', function (err, count) {});
)時,所有事情都能正常工作。
我不知道什麼是問題,我如何訂閱動態創建的渠道。
我正在使用laravel 5.2。
有你找出解決方案呢? –
@MohammadTasneemFaizyab,我對我的問題添加了一個答案。 –