我试图创建一个使用Laravel作为后端API客户端和我的前端的SPA的实时通知系统,我使用React作为前端,但是对于以下例如,我将使用我创建的简单Vue.Js和刀片来获取工作示例。Laravel使用Socket.io将广播转播到私人频道
所以,这一切的一切,我有一个触发事件的路线,这是显示像下面的例子:
Route::get('fire', function() {
// this fires the event
$user = App\Models\User::find(1);
event(new App\Events\CampaignUploadedWithSuccess($user, 'testing a notification'));
return "event fired";
});
,它触发看起来像这样
<?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 CampaignUploadedWithSuccess implements ShouldBroadcast
{
protected $user;
public $notification;
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @param $user
* @param $notification
*/
public function __construct($user, $notification)
{
$this->user = $user;
$this->notification = $notification;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return ['notifications-channel.' . $this->user->id];
}
}
事件所以我在一个名为notification-channel.{userId}
的频道上播出我有一个使用节点运行的socket.js文件。
这看起来像使用node 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('notifications-channel.1', function(err, count) {
});
redis.on('message', function(channel, message) {
console.log('Notification Recieved: ' + message);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function(){
console.log('Listening on Port 3000');
});
运行在服务器和触发事件做什么,我要象下面这样:
快乐的日子!我向广播信道..
不过,我现在有一个刀片文件调用test.blade将在Vue公司和Socket.io
,看起来像这样
<!DOCTYPE html>
<html>
<head>
<title>Laravel</title>
</head>
<body>
<h1>Notifications</h1>
<ul>
<li v-repeat="notification: notifications">@{{ notifications }}</li>
</ul>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/0.12.16/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.7/socket.io.min.js"></script>
<script>
var socket = io('http://localhost:3000');
new Vue({
el: 'body',
data: {
notifications: []
},
ready: function() {
socket.on('notifications-channel.1', function(data) {
alert(data.notification);
});
}
});
</script>
</body>
</html>
和拉这里的目标是在通知通道1有广播数据时让消息警报。然而这不起作用。
所以我的问题是,如何向频道广播并使用socket.io,Laravel和Redis从频道中消费广播。
我也有点在私人频道的黑暗中,以及如何为一位用户创建频道。该文档很好,但它没有提供如何实现这一目标的真实世界示例,并且有多个平台使用通知。
这使得有很大的意义代替它,所以我改变了叶片的文件,当我在浏览器中运行它,我看到我的H1标签,说通知,控制台显示错误的连接拒绝,所以我运行节点socket.js和错误消失,在我的脑海里,这意味着它连接到本地主机:3000,我解雇了事件,它显示在服务器控制台中,但不会控制台登录客户端...我使版本匹配:) –
我想我可能会错过与我的socket.js文件中的套接字的连接 –
您广播您的事件的频道具有名称通知 - 然后动态地通过用户标识并在客户端上传输通道硬编码它与1.你目前登录的用户有ID 1请你确认。 –