【问题标题】:Call laravel event within socket.io在 socket.io 中调用 laravel 事件
【发布时间】:2017-04-29 00:01:12
【问题描述】:

是否可以调用 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 以更新数据库中的记录的最佳方式是什么。

谢谢

【问题讨论】:

    标签: php node.js laravel sockets socket.io


    【解决方案1】:

    您可以在我自己的这两个存储库中找到一个功能齐全的示例,说明您想要做什么:

    https://github.com/bretanac93/socket_io_events_laravel

    https://github.com/bretanac93/backend_io_events_laravel

    您需要运行 Redis 服务器并配置和安装依赖项以便您可以测试项目,前端与后端位于同一存储库中,是一个小 Vue 应用程序,当人们实时显示连接和断开连接,它使用 LoggedIn、LoggedOut 和 RegisteredEvents,但您也可以定义自己的事件,希望这个小例子对您有用,Bests! ;)

    PD:如果你喜欢,别忘了给它加星,并投票给答案XD。

    更新问题

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

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

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

    希望您现在理解得很好,如果您需要更多帮助或者您还需要什么,请不要犹豫发表评论。干杯! ;)

    【讨论】:

    • 我只需要知道用户何时离开站点,获取他们的套接字 ID 并更新数据库中的记录,这很简单,但我不知道该怎么做。 :'C,我正在尝试使用 socket.js 文件中的对象请求,但不起作用。
    • 如果你检查了这些例子,那么你会意识到你想要做的就是在他们身上,无论如何,下面我会用 sn-ps XD 发布另一个答案!
    • 感谢您的宝贵时间,我找到了使用节点请求库的解决方案,通过服务器上的 socker io 文件中的 socket_id 向特定 url 发送请求。问候
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多