2015-11-02 334 views
14

我需要在Laravel中實現非常簡單和非常基本的websocket,以實現我的phonegap應用程序作爲客戶端和我的Laravel網站作爲服務器之間的數據同步過程。我遵循這個教程http://www.binarytides.com/websockets-php-tutorial/來實現和測試websocket,它的工作原理。像這樣我需要非常簡單的laravel實現,我可以從js客戶端調用我的控制器方法。客戶端將成爲我的phonegap應用程序。我在laravel的教程中找到了一些websocket的包,但是我發現很難實現它們。沒有人與控制器進行交互,他們正在傾聽事件並在各處創建類,但不在控制器中。我已經將所有的邏輯寫入Controller,並用ajax請求對其進行了測試,但現在我將通過websocket實現它,因爲我需要雙向通信來實現同步過程。我是Laravel的新手,所以請給我一些幫助。如果有人能告訴我如何將關於laravel的教程集成到客戶端,以便客戶端可以直接調用控制器來發送數據,那麼這將非常棒。laravel 5中簡單的websocket實現

+0

我的建議是在節點服務器下運行Socket.io。 –

+0

我想在客戶端使用簡單的js套接字。因爲它將使用phonegap,所以我想保持簡單。 – hassan

+0

實際上使用socket.io會給你一個很少有幾行代碼的Websocket連接。這就是我個人實現的方式。 –

回答

18

我結束了使用brainboxlabs的brainsocket(https://github.com/BrainBoxLabs/brain-socket)。正如其文檔所述,其laravel 4軟件包,但它也適用於laravel 5沒有任何問題。

用laravel安裝此包5.按照上述github鏈接上的文檔。它說在app文件夾中創建一個event.php文件,以及一些與事件相關的代碼。代替這一步,只需在app/Providers/EventServiceProvider.php文件中添加與事件相關的代碼即可。在它的引導方法中,添加代碼是

Event::listen('generic.event',function($client_data){ 
    return BrainSocket::message('generic.event',array('message'=>'A message from a generic event fired in Laravel!')); 
}); 

Event::listen('app.success',function($client_data){ 
    return BrainSocket::success(array('There was a Laravel App Success Event!')); 
}); 

Event::listen('app.error',function($client_data){ 
    return BrainSocket::error(array('There was a Laravel App Error!')); 
}); 

在該步驟之後有在應用程序中添加

require app_path().'/filters.php'; 
require app_path().'/events.php'; 

的步驟和/開始/ global.php。你可以離開這一步laravel 5.

好吧,所以Web套接字已經實現。您可以運行命令artisan brainsocket:start,使用cmd啓動websocket服務器進行測試。您可以選擇提供端口工匠brainsocket:start 9000

另一個要求是調用controller來執行其餘任務。對於這個我直接編輯到提供程序包。我不推薦這樣做,因爲這不是一個好方法。當您使用作曲家更新您的軟件包時,您的更改將會丟失。所以你必須找到一個更好的選擇。但它只是一個改變。

在供應商\ brainboxlabs \腦插座的\ src \ BrainSocket \ BrainSocketServer.php我編輯的方法代碼 「開始」 和替換

$this->server = IoServer::factory(
      new HttpServer(
       new WsServer(
        new BrainSocketEventListener(
         new BrainSocketResponse(new LaravelEventPublisher()) 
        ) 
       ) 
      ) 
      , $port 
     ); 

$this->server = IoServer::factory(
      new HttpServer(
       new WsServer(
       new \FMIS\Http\Controllers\SynchronizationController(
        new BrainSocketResponse(new LaravelEventPublisher()) 
              ) 
       ) 
      ) 
      , $port 
     ); 

在我SynchronizationController文件。

我加入這個頂部

use Ratchet\MessageComponentInterface; 
use Ratchet\ConnectionInterface; 
use BrainSocket\BrainSocketResponseInterface; 

執行的界面這個樣子。

class SynchronizationController extends Controller implements MessageComponentInterface{ 

並實現了該接口的方法。

public function __construct(BrainSocketResponseInterface $response) { 
     $this->clients = new \SplObjectStorage; 
     $this->response = $response; 
} 

public function onOpen(ConnectionInterface $conn) { 
     echo "Connection Established! \n"; 
} 


public function onMessage(ConnectionInterface $conn, $msg){ 
echo "this messge gets called whenever there is a messge sent from js client"; 
} 

public function onClose(ConnectionInterface $conn) { 
    echo "Connection {$conn->resourceId} has disconnected\n"; 
} 

public function onError(ConnectionInterface $conn, \Exception $e) { 
     $msg = "An error has occurred: {$e->getMessage()}\n"; 
     echo $msg; 
     $conn->close(); 
} 

你必須改變這些方法來實現你的功能。之後,您可以從您的js客戶端撥打電話。而且你也不需要使用它的js庫。您只需使用本教程中描述的js客戶端發送數據http://www.binarytides.com/websockets-php-tutorial/

讓我知道是否有人需要任何更多的幫助其實施。

+0

夥計,令人驚歎的解釋。 +1。我想知道是否可以使用控制器而不必實際修改供應商中的文件?這樣就可以自由安裝laravel更新。謝謝你的幫助。 – Learner

+0

@學習者你可以創建一個擴展brainSocket類的自定義套接字類和命令。不是自己做的,而是看着它,這就是我所要做的。 – sourRaspberri

+0

不幸的是BrainSocket並沒有更新他們的源代碼來與Laravel 5.5一起工作...... – AmjadoV