webloopio/nette-websockets

Nette 扩展,用于实现灵活且简单的 WebSocket 服务器

dev-master 2018-09-17 10:38 UTC

This package is not auto-updated.

Last update: 2024-09-29 05:14:58 UTC


README

安装

通过 composer 安装此包

$ composer require webloopio/nette-websockets

设置和启动

在 Nette 配置.neon 中启用所需扩展。我们使用 Kdyby/Console 来运行命令。

extensions:
    netteWebsockets: Webloopio\NetteWebsockets\DI\NetteWebsocketsExtension
    console: Kdyby\Console\DI\ConsoleExtension

要从您的 Nette 项目根目录启动 WebSocket 服务器,请执行此命令

$ php www/index.php webloop:ws-server:start

您可以通过在终端中按 ctrl+C 来停止正在运行的服务器

用法

定义控制器

此包提供了 Controller 接口,因此您可以将您的应用程序分解成逻辑块。您可以将控制器看作是 Nette 中的 Presenters。

要注册新的控制器,您可以简单地扩展包的 Controller 类

<?php
use Webloopio\NetteWebsockets\Controller\Controller;

class ChatController extends Controller {

}

然后,您必须在配置中注册您的新控制器

services:
    authController:
        class: ChatController
        tags: [webloopio.nettews.controller]

# OR

netteWebsockets: 
    controllers:
        - ChatController

控制器方法

我们提供了两种您可以使用的方法

动作

<?php
use Webloopio\NetteWebsockets\Controller\Controller;
use Webloopio\NetteWebsockets\Client\Client;
use Webloopio\NetteWebsockets\Server\Message;

class ChatController extends Controller {
    public function actionSend( Client $client, Message $message ) {
        $chatMessage = $message->getMessage(); // Hello!
        $userId = $client->getUserId();
        
        // some logic?
        $this->chatService->saveMessage( $userId, $chatMessage );
        
        // send raw WS message directly to user
        $client->send( "Hi" ); 
        // or
        $this->sendMessage( $client, "Hi again" );
    }
}

循环

<?php
use Webloopio\NetteWebsockets\Controller\Controller;
use Webloopio\NetteWebsockets\Client\Client;
use Webloopio\NetteWebsockets\Client\ClientCollection;
use Webloopio\NetteWebsockets\Server\Message;

class ChatController extends Controller {
    public function loopDispatch( ClientCollection $clients ) {
        // we can fetch new messages from db
        $messages = $this->chatService->getNewMessages();
        
        if( !$messages ) {
            return;
        }
        
        // dispatch new messages to all users that are online
        foreach( $clients->getClients() as $client ) {
            $this->sendMessage( $client, $messages->getJson() );
        }
    }
}

命令

启动服务器

$ php www/index.php webloop:ws-server:start