2017-09-28 185 views
2

我试图显示用户登录到网站时的实时消息通知计数。为此,我正在使用socketio,redis和laravel事件。但它不起作用。在laravel日志中,我收到一条消息。在此消息中显示count,但socket为空。我想我错过了什么。我的gitbash显示频道订阅和用户连接。Laravel事件广播与socketio和redis不在laravel 5.4中工作?

Gitbash

[email protected]:~/Code/cabinapi$ node socket.js 
    listening on *:3000 
    Redis: message-channel subscribed 
    a user connected 

Laravel登录

[2017-09-28 07:21:57] local.INFO: Broadcasting [App\Events\MessageEvent] on channels [message-channel] with payload: 
{ 
    "count": 9, 
    "socket": null 
} 

控制器

public function privateMessageAPICount($id) 
{ 
     $count = PrivateMessage::where('receiver_id', new \MongoDB\BSON\ObjectID($id)) 
      ->where('read', 0) 
      ->count(); 

     if ($count > 0){ 
      event(new MessageEvent($count)); 
     } 
} 

routes-> web.php

Route::get('/message/count/{id}', 'Cabinowner\[email protected]'); 

.ENV

APP_URL=http://cabinapi.app 
BROADCAST_DRIVER=redis 
REDIS_HOST=127.0.0.1 
REDIS_PASSWORD=null 
REDIS_PORT=6379 

MessageEvent.php

<?php 

namespace App\Events; 

use Illuminate\Broadcasting\Channel; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Broadcasting\PrivateChannel; 
use Illuminate\Broadcasting\PresenceChannel; 
use Illuminate\Foundation\Events\Dispatchable; 
use Illuminate\Broadcasting\InteractsWithSockets; 
use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 

class MessageEvent implements ShouldBroadcast 
{ 
    use Dispatchable, InteractsWithSockets, SerializesModels; 

    public $count; 
    public function __construct($count) 
    { 
     $this->count = $count; 
    } 

    public function broadcastOn() 
    { 
     return ['message-channel']; 
    } 
} 

则须─>所有者 - > layouts->应用程序。 blade.php

<body> 
<span class="label label-success msgSpan"><span class="msgCountRemove">{!! $miscellaneous->privateMessageCount() !!}</span></span> 

<script src="{{ asset('plugins/jQuery/jquery-2.2.3.min.js') }}"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.8/socket.io.min.js"></script> 
    <script> 
     var socket = io('{{ env("APP_URL") }}:3000'); 
     socket.on('message-channel:App\\Events\\MessageEvent', function(data){ 
      $('.msgCountRemove').remove(); 
      $('.msgSpan').append('<span class="msgCountRemove">'+data.count+'</span>'); 
     }); 
    </script> 

</body> 

config-> app.php

'Redis' => Illuminate\Support\Facades\Redis::class, 

socket.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('message-channel', function() { 
    console.log('Redis: message-channel subscribed'); 
}); 
redis.on('message', function(channel, message) { 
    console.log('Redis: Message on ' + channel + ' received!'); 
    console.log(message); 
    message = JSON.parse(message); 
    io.emit(channel + ':' + message.event, message.data); 
}); 

io.on('connection', function(socket){ 
    console.log('a user connected'); 
    socket.on('disconnect', function(){ 
     console.log('user disconnected'); 
    }); 
}); 
http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 
+0

你从哪里得到该日志?你可以检查config/broadcasting.php吗?也许你设置广播驱动程序登录那么.env不工作? –

+0

@HanlinWang,Log我从storage-> logs-> laravel.log。不,我没有设置广播日志。 ''default'=> env('BROADCAST_DRIVER','null'),' –

+0

我在本地测试了你的代码,它全部正常工作,而且套接字是空的,这是从你的socket.js'{“事件“:”App \\ Events \\ MessageEvent“,”data“:{”count“:1,”socket“:null},”socket“:null} '所以你没有收到像这样的日志,对吧? –

回答

0

找不到为什么它不laravel 5.4工作的确切原因。 但我添加了一些更改。现在我正在获取实时消息通知计数。以下列出了我所做的改变。

我完全做实时通知计数与redis的帮助和socketio

socket.js(Removed ioredis and included redis

var redis = require('redis'); 
io.on('connection', function(socket){ 
    console.log('a user connected'); 

    var redisClient = redis.createClient(); 
    redisClient.subscribe('message'); 
    redisClient.on('message', function(channel, message){ 
     console.log('new message in queue', channel, message); 
     socket.emit(channel, message); 
    }); 

    socket.on('disconnect', function(){ 
     redisClient.quit(); 
     console.log('user disconnected'); 
    }); 
}); 

控制器

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

则须─>所有者 - > layouts-> app.blade.php

<script> 
     var socket = io('{{ env("APP_URL") }}:3000'); 
     socket.on('message-channel:App\\Events\\MessageEvent', function(data){ 
      $('.msgCountRemove').remove(); 
      $('.msgSpan').append('<span class="msgCountRemove">'+data+'</span>'); 
     }); 
    </script> 

移除MessageEvent事件。php