简体   繁体   English

Laravel事件在注册时不会与套接字一起显示

[英]Laravel Event on register won't display with socket

I am trying to Show new registered users in my browser, so users who are already logged in can see something like "blabla has registered..." 我正在尝试在浏览器中显示新的注册用户,因此已经登录的用户可以看到类似“ blabla已经注册...”的信息。

First I created an Event class with its channel like this: 首先,我创建了一个Event类,其通道如下所示:

class UserSignedUp extends Event implements ShouldBroadcast
{
    use SerializesModels;

    public $user;

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

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

I used laravel auth scaffolding to built a Basic Login/Register System, so I went inside the Auth/RegisterController and added a function to call the Event if a user Registers like this: 我使用laravel auth脚手架构建了一个基本的登录/注册系统,因此我进入了Auth / RegisterController并添加了一个函数,如果用户注册时调用Event:

protected function create(array $data)
{
    $this->user = [
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
    ];

    # fire event
    $this->broadcastSignedUpUsers($this->user);

    return User::create($this->user);
}

# Call UserSignedUp Event and show using node + socket.io
protected function broadcastSignedUpUsers($user)
{
    event(new UserSignedUp($user));
}

I installed node.js, socket.io and redis. 我安装了node.js,socket.io和Redis。

I built following script to create a Server:

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

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

// class declaration
var Redis = require('ioredis');

// Redis UserSignedUp Channel
var redisSignedUp = new Redis();

redisSignedUp.subscribe('signed-up-channel');

redisSignedUp.on('message', function(channel, message) {
    message = JSON.parse(message);
    console.log(message.data.user);
    io.emit(channel + ':' + message.event, message.data);
});

// run server on port 3000
server.listen(3000);

I run that Server successfully with this command: node socket.js 我使用以下命令成功运行该服务器:node socket.js

Further I have this vue script to push the registered users in an array 此外,我有这个vue脚本将注册的用户推送到数组中

var socket = io('http://192.168.3.114:3000');

new Vue({

    el: '#app',

   data: {
       users: []
   },

   ready: function() {
       socket.on('signed-up-channel:App\\Event\\UserSignedUp', function(data) {
           console.log(data);
           this.users.push(data.user);
       }.bind(this));
   }

});

And in my blade view I have this li to show new registered users 在我的刀片视图中,我有这个li来显示新的注册用户

<li v-for="user in users">@{{ user.name }}</li>

if I register using another browser that user is not displayed, but the users information gets display in my command line like this: C:\\xampp\\htdocs\\myApp (master) 如果我使用其他浏览器进行注册,则不会显示该用户,但是用户信息会像这样在我的命令行中显示:C:\\ xampp \\ htdocs \\ myApp(主用户)

λ node socket.js λ节点socket.js
{ name: 'asdasd', {名称:'asdasd',
email: 'aascasc@asda.de', 电子邮件:“ aascasc@asda.de”,
password: '$2y$10$yujB1ZSFEezVeZ77Jec67.Mws3qeD7bnx3QaVhJACXo58KBy3E3iG' } 密码:“ $ 2y $ 10 $ yujB1ZSFEezVeZ77Jec67.Mws3qeD7bnx3QaVhJACXo58KBy3E3iG”}

When I am using events with socket.io via redis I have to use the following traits: Dispatchable, InteractsWithSockets, SerializesModels . 当我通过redis在socket.io中使用事件时,我必须使用以下特征: Dispatchable, InteractsWithSockets, SerializesModels

These traits are in the docs 这些特征在文档中

Implementation 实作

class CampaignChanged extends Event implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $campaign;

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

    public function broadcastOn()
    {
        return new Channel('campaign-changed');
    }
}

socket.js socket.js

let app = require('express')();
let http = require('http').Server(app);
let io = require('socket.io')(http);
let Redis = require('ioredis');
let redis = new Redis();

redis.subscribe(['campaign-changed','canceled-bid','winning-bid','highest-bid','no-bids'], function(err, count) {});

redis.on('message', function(channel, message) {
    message = JSON.parse(message);
    if(channel === 'campaign-changed'){
        io.emit('campaign-changed:' + message.data.campaign.id, message.data);
    }
    else {
        io.emit(channel + ':' + message.data.item.id, message.data);
    }
});

http.listen(3000, function(){
    console.log('Listening on Port 3000');
});

usage: 用法:

window.socket = io('http://192.168.10.10:3000');

socket.on("campaign-changed:"+this.campaign.id, message =>{
    this.campaign = message.campaign;
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM