php - 在 socket.io 中调用 laravel 事件

标签 php node.js laravel sockets socket.io

是否可以调用 laravel 事件并在 socket.io 中发送变量?

这是我想知道是否可以在发送套接字 ID 的套接字中实现的行:

socket.emit('App\\Events\\ClosePlaySession', socket.id);

Socket.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server, {'pingInterval': 2000, 'pingTimeout': 5000});
var Redis = require('ioredis');
var redis = new Redis();

io.set('heartbeat timeout', 10);
io.set('heartbeat interval', 4);

server.listen(3000);

io.on('connection', function (socket) {
    console.log("new client connected " + socket.id);

    socket.on('disconnect', function() {
        socket.emit('App\\Events\\ClosePlaySession', socket.id); // This is possible?
        console.log('client disconnected');
    });
});

事件ClosePlaySession.php

<?php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

// Repositories
use wtv\Repositories\PlaySessionRepository;

class ClosePlaySession extends Event implements ShouldBroadcast
{
    use SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($socket_id)
    {
        $playSessionRepository = new PlaySessionRepository;
        $playSessionRepository->closeSession($socket_id);
    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return ['closePlaySession'];
    }
}

或者发送套接字 ID 以更新数据库中的记录的最佳方式是什么。

谢谢

最佳答案

您可以在我自己的这两个存储库中找到您想要执行的操作的完整功能示例:

https://github.com/bretanac93/socket_io_events_laravel

https://github.com/bretanac93/backend_io_events_laravel

你需要一个正在运行的 Redis 服务器并配置和安装依赖项,以便你可以测试项目,前端位于后端的同一个存储库上,是一个小 Vue 应用程序,我在那里实时显示人们何时连接和断开连接,它使用 LoggedIn、LoggedOut 和 RegisteredEvents,但你也可以定义自己的事件,希望这个小例子适合你,最好! ;)

PD:如果您喜欢,请不要忘记加注星标,并对答案投票 XD。

更新的问题

你可以查看这个链接,标记的那一行,你会发现我修改了db中的用户:https://github.com/bretanac93/backend_io_events_laravel/blob/master/app/Listeners/SuccessfullLogin.php#L30

对此的解释:你总是有一个被广播的事件,但你也可以定义一个 EventListener,当这个事件被调用时,你只需要触发这个监听器,一切都可以,这里,一切都可以翻译为在用户登录、注册或注销时监听(至少在这个项目中),如果发生任何这些操作,触发在你的 EventServiceProvider.php 上定义的他们自己的监听器,如下所示:https://github.com/bretanac93/backend_io_events_laravel/blob/master/app/Providers/EventServiceProvider.php#L16

请注意,当其中一些操作发生时,您仅使用套接字与前端进行通信,并且后端负责触发正确的事件,监听现在调用的操作(即:在聊天室中,您希望在用户上线或离线时进行反射,在后端定义两个监听器,一个用于登录,另一个用于注销,当发生其中一种情况时,被称为定义为广播的事件,套接字从后端发送该信号到前端,但将更改存储在当您发送该信号时,数据库会在前端中更改 DOM 中的消息(离线在线)。

希望您现在明白了,如果您需要更多帮助或者您还需要什么,请随时发表评论。干杯! ;)

关于php - 在 socket.io 中调用 laravel 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129346/

相关文章:

php - Laravel Eloquent - 覆盖模型的构造函数以更改属性

写入文件时的 PHP,如何将文本添加到现有文本的文件中?

php - CSS :nth-child() selector in a PHP constructed site

javascript - 如何从 Atom Electron 应用程序中调用 Shell 脚本或 python 脚本

php - 过滤掉两列等于一的行

css - 链接到 laravel + forge 中公用文件夹之外的 Assets

php - 旧动态 url 的 mod_rewrite 向后

php - C++按字符串调用函数,与PHP性能对比,C++如何优化代码?

javascript - MongoDB - 查询难题 - 文档引用或子文档

node.js - 如何在查询另一个模型后添加虚拟字段