2016-03-24 12 views
1

Ich benutze Redis + Laravel + Nodejs, um Nachricht zu senden. Mein Code ist folgen alsWie sende ich eine Nachricht mit Redis und Nodejs mit Laravel

In Controller

function postReassignlead(Request $request){ 
    $data = Input::get(); 
    $leadId = $data['leadid']; 
    $assignedtoid = $data['assignedtoid']; 
    $assignedbyid = $data['assignedbyid']; 

    $message = "A lead :".$leadId," has been assigned to YOU by ".$assignedbyid.""; 

    $redis = LRedis::connection(); 
    $redis->publish('message', $message); 

} 

und in meinem server.js

var app = require('express')(); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 
var redis = require('redis'); 

server.listen(8890); 

io.on('connection', function (socket) { 

    console.log("new client connected"); 
    var redisClient = redis.createClient(); 
    redisClient.subscribe('message'); 

    redisClient.on("message", function(channel, message) { 
    console.log("mew message in queue "+ message + "channel"); 
    socket.emit(channel, message); 
    //res.flush(); 
    }); 

    socket.on('disconnect', function() { 
    redisClient.quit(); 
    }); 

}); 

dann auf home.php Seite

<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script> 
    <script src="https://cdn.socket.io/socket.io-1.3.4.js"></script> 

    <div class="container"> 
     <div class="row"> 
      <div class="col-lg-8 col-lg-offset-2"> 
       <div id="messages"></div> 
      </div> 
     </div> 
    </div> 
    <script> 
     var socket = io.connect('http://localhost:8890'); 
     socket.on('message', function (data) { 
      $("#messages").append("<p>"+data+"</p>"); 
     }); 
    </script> 

Hier wird die Nachricht gesendet wird, an alle Benutzer, die angemeldet sind, aber ich möchte dies auf nur einen Benutzer

ändern

etwas, was ich kann breit bestimmten Benutzer-ID

Wie

$redis = LRedis::connection(); 
    $redis->publish('message_1990', $message); 

so in meinem home.php

kann ich den Code so etwas wie dieses haben

<script> 
     var socket = io.connect('http://localhost:8890'); 
     socket.on('message_1990', function (data) { 
      $("#message_1990").append("<p>"+data+"</p>"); 
     }); 
</script> 

Antwort

0

einige tun Recherchiere bei Redis für mein eigenes Projekt und bin auf deine Frage gestoßen.

Der erste Parameter der Publish- und Subscribe-Methoden ist der "channel", der für die Kommunikation verwendet wird. In diesem Fall müssten Sie nur die Nachricht "message_1990" sowohl am sendenden als auch am empfangenden Ende aktualisieren.

Redis - Laravel

Dies würde bedeuten, dass Ihre Laravel App würde wissen, welcher Kanal die Nachrichten an, die die Nachricht ist ein Team Broadcast-Nachricht einfach bestimmt, oder vielleicht können zu veröffentlichen, nicht immer werden.

Für Flexibilität könnten Sie pass the message in JSON form, dann auf dem Client einfach auspacken, um Lieferung/Anzeige zu bestimmen. Auf diese Weise wird die Nachricht an alle weitergegeben und der Kunde kann entscheiden, was damit zu tun ist.

Pass PHP array to Javascript

So im Laravel Controller:

$message = "A lead :".$leadId," has been assigned to YOU by ".$assignedbyid.""; 

$redis = LRedis::connection(); 

// PHP array to convert to JSON, add other fields as necessary 
$msgPacket = ["rx"=>"bsmith","msgtype"=>"leadGen","message"=>$message]; 

// send as a JSON data packet 
$redis->publish('message', json_encode($msgPacket)); 

Auf der Clientseite unpackage the JSON data, um zu bestimmen, was damit zu tun:

<script> 
    socket.on('message', function (data) { 
     obj = JSON.parse(data); 

     // receive team and personal messages 
     if((obj.msgtype == "leadGen") || (obj.rx == "bsmith")) { 
      $("#message").append("<p>"+data+"</p>"); 
     } 
     // else ignore the message 

    }); 
</script> 

Hier habe ich verwendet JSON.parse() aber es ist not always necessary und die Daten sind auch über die Datenvariable zugänglich, wie in data.msgtype

+0

hehe danke für die Antwort Ich habe eine ähnliche Methode anstelle der JSON-Daten angewendet Ich habe eine einzelne Zeichenfolge mit '_' getrennt gesendet und im Frontend habe ich sie einfach in JS-Array geschnitten und überprüft die 'ID' der Die Nachricht ist die gleiche wie 'Auth :: user-> ID' Dann wird die Nachricht an ihr Popup angehängt :). Aber hier hört jeder Benutzer den Nachrichtensocket ab, gibt es einen Weg, wie jeder Benutzer auf seinen eigenen Socket hört, so dass, wenn wir veröffentlichen, er nur zu diesem bestimmten Benutzer geht? – Vikram