Socket.io - 如何根据帖子ID评论帖子?

时间:2015-12-12 23:54:46

标签: php jquery socket.io laravel-5

我正在使用Laravel 5.0,我有一个视图,其中我显示了多个帖子。我的Post.php,Comment.php和我的User.php

之间存在模型关系

home.blade.php查看:

 $data = [
        'event' => 'UserComment',
        'data'  => [
            'username' => Auth::user()->getUsername(),
            'comment'  => Request::input('comment'),
            'post_id'   => $id
        ]
    ];

    Redis::publish('user-comment', json_encode($data));

使用socket.io v1.3.5,我如何为每个帖子指定评论。例如,我有一个ID为1的帖子和另一个ID为2的帖子。我必须做什么才能使Post 1中的评论留在Post 1中,Post 2中的评论留在Post 2中。目前,在Post 1中发表的评论将出现在Post 2评论部分,反之亦然。

PostController.php

var server = require('http').Server();

var io     = require('socket.io')(server);

var Redis  = require('ioredis');

var redis  = new Redis();

var usernames = {};



redis.subscribe('user-comment');

redis.on('message', function(channel, message){

message = JSON.parse(message);

var room = message.data.post_id;

console.log(room);

// io.emit(channel + ':' + message.event, message.data);

});

server.listen(3000);

server.js

socket.on('user-comment:UserComment', function(data){
        $('#home_chat_content_div_body').append($('<h4>').text(data.username).css('color', '#00c5cd'));
        $('#home_chat_content_div_body').append($('<p>').text(data.comment));
        $('#home_chat_content_div_body').append($('<hr>'));

home.blade.php - javascript

{{1}}

1 个答案:

答案 0 :(得分:1)

你有几个选择。但是,基本上你想要从PHP发布评论到SocketIO。从本质上讲,PHP将充当SocketIO的客户端并发出消息。在您的代码中插入注释时,您希望使用以下方法之一将事件发送到SocketIO:

您可以使用ElephantIO:

use ElephantIO\Client as Elephant;

$elephant = new Elephant('http://localhost:8000', 'socket.io', 1, false, true, true);

$elephant->init();
$elephant->send(
    ElephantIOClient::TYPE_EVENT,
    null,
    null,
    json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();

echo 'tryin to send `bar` to the event `foo`';

来源:http://elephant.io/#usage

或者,如果您在后台使用Redis,则可以使用SocketIO Redis PHP发射器:

$redis = new \Redis(); // Using the Redis extension provided client
$redis->connect('127.0.0.1', '6379');
$emitter = new SocketIO\Emitter($redis);
$emitter->emit('chat message', 'payload str');

来源:https://github.com/rase-/socket.io-php-emitter

此外,您将从index.js中删除此代码,因为不再需要它:

socket.on('chat message', function(msg){
    io.emit('chat message', msg);
});

而且......最新版本的SocketIO是1.3.7。如果可能的话,绝对升级。

为SocketIO使用房间的示例方法:

$redis = new \Redis(); // Using the Redis extension provided client
$redis->connect('127.0.0.1', '6379');
$emitter = new SocketIO\Emitter($redis);
$emitter->in('post:123'); // send this event only to clients who are in this room for 'new comment'
$emitter->emit('new comment', $dataArray);

然后在你的客户端:

socket.emit('subscribe-post', 'post:123'); // subscribe to events in the post:123 room
socket.on('new comment', function(data){
    console.log( data );
});

然后在节点中:

socket.on('subscribe-post', function(room) {
    socket.join(room); // join the post:123 room
});