2016-12-13 30 views
1

是否可能調用laravel事件並在socket.io中發送變量?在socket.io中調用laravel事件

這是我想知道是否有可能在插座實現發送插座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以更新數據庫中的記錄的最佳方式。

感謝

回答

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 離線在線)之間變更的消息。

希望你現在理解得很好,如果你需要更多的幫助,或者如果你還有什麼需要的話,請不要猶豫,發表評論。乾杯!;)

+0

我只需要知道什麼時候用戶離開該網站,拿他們的套接字ID和更新數據庫中的記錄,是非常簡單的,但我不知道該怎麼做。 :'C,我試圖用socket.js文件中的對象請求,但不起作用。 –

+0

如果你檢查了這些例子,那麼你會意識到你想要做的就是在他們身上,無論如何,下面我會用XD片段發佈另一個答案! – bretanac93

+0

感謝您的時間,我找到了一個節點請求庫的解決方案,通過服務器上的socker io文件中的socket_id向特定的url發送請求。問候 –