atipik/hoa-websocket-bundle

1.0.0 2019-06-27 08:38 UTC

This package is not auto-updated.

Last update: 2024-09-28 16:37:59 UTC


README

Build Status

此包允许您在Symfony2中使用Hoa/Websocket/Server和Hoa/Websocket/Client。

通过简单的配置,您将能够启动您的WebSocket服务器

1. 安装

1.1 更新您的composer.json文件

在require部分添加以下行

{
    "require": {
        "atipik/hoa-websocket-bundle" : "1.*@dev"
    }
}

1.2 安装依赖项

composer update

1.3 更新您的AppKernel.php文件

<?php
# app/AppKernel.php
// ...

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new Atipik\Hoa\WebSocketBundle\AtipikHoaWebSocketBundle(),
            // ...
        );

        return $bundles;
    }

    // ...
}

1.4 配置您的项目

要启用此包,您必须在config.yml中添加以下行

# app/config/config.yml
atipik_hoa_web_socket: ~

您还可以指定地址和端口。

# app/config/config.yml
atipik_hoa_web_socket:
    address : 1.3.3.7
    port    : 4242

默认情况下,服务器将在127.0.0.1:8080上启动

2. 架构

Symfony 2命令php app/console hoa:websocketserver只有一个任务:调用运行器。

运行器将模块(您的逻辑代码)和由Atipik\Hoa\WebSocketBundle\WebSocket\Server管理的WebSocket事件链接起来。

当WebSocket服务器接收到事件时,运行器会捕获它并调用所有已订阅的模块。

3. 服务器

3.1 简单用法

  • 在您的包中,创建一个扩展Atipik\Hoa\WebSocketBundle\WebSocket\Module\Module的类
<?php
# src/My/Bundle/WebSocket/Module/MyModule.php
namespace My\Bundle\WebSocket\Module;

use Atipik\Hoa\WebSocketBundle\WebSocket\Module\Module;

class MyModule extends Module
{
}
  • 更新您的services.yml
# src/My/Bundle/Resources/config/services.yml
services:
    my_bundle.my_module:
        class: My\Bundle\WebSocket\Module\MyModule
        tags:
            - { name: atipik_hoa_web_socket.module }

别忘了添加atipik_hoa_web_socket.module标签!

  • 在这个类中,实现getSubscribedEvents方法
<?php
# src/My/Bundle/WebSocket/Module/MyModule.php
namespace My\Bundle\WebSocket\Module;

use Atipik\Hoa\WebSocketBundle\WebSocket\Module\Module;

class MyModule extends Module
{
    public function getSubscribedEvents()
    {
        return array(
            'open'    => 'onOpen',
            'message' => 'onMessage',
        );
    }
}
  • 添加逻辑代码

您可以使用$this->getBucket()获取当前bucket。

<?php
# src/My/Bundle/WebSocket/Module/MyModule.php
namespace My\Bundle\WebSocket\Module;

use Atipik\Hoa\WebSocketBundle\WebSocket\Module\Module;

class MyModule extends Module
{
    public function getSubscribedEvents()
    {
        return array(
            'open'    => 'onOpen',
            'message' => 'onMessage',
        );
    }

    public function onOpen()
    {
        $this->getLogger()->log('Here comes a new challenger !');
    }

    public function onMessage()
    {
        $data = $this->getBucket()->getData();

        $this->getLogger()->log(
            'Data received in %s: %s',
            __METHOD__,
            $data['message']
        );
    }
}
  • 启动您的WebSocket服务器
php app/console hoa:websocketserver

3.2 高级用法

3.2.1 模块组

如果您想扩展服务器,可以将模块分配给不同的组,并为一个或多个组启动服务器。

您可以在同一个组中分配许多模块

如果您不指定组启动服务器,则将使用所有模块。

  • 只需在您的模块中重写getGroup()方法
<?php
# src/My/Bundle/WebSocket/Module/MyModule.php
namespace My\Bundle\WebSocket\Module;

use Atipik\Hoa\WebSocketBundle\WebSocket\Module\Module;

class MyModule extends Module
{
    // ...

    /**
     * Returns group name
     *
     * @return string
     */
    public function getGroup()
    {
        return 'foo';
    }

    // ...
}
  • 指定组启动服务器
php app/console hoa:websocketserver -g foo

您也可以指定多个组

php app/console hoa:websocketserver -g foo -g bar

3.2.2 重写运行器类

如果您想修改运行器的工作方式,应重写其类

  • 创建一个扩展Atipik\Hoa\WebSocketBundle\WebSocket\Runner的运行器类。
  • 更新您的services.yml
# src/My/Bundle/Resources/config/services.yml
parameters:
    atipik_hoa_web_socket.runner.class: My\Bundle\WebSocket\Runner

3.2.3 重写服务器类

如果您想修改WebSocket服务器的工作方式,应重写其类

  • 创建一个扩展Atipik\Hoa\WebSocketBundle\WebSocket\Server的服务器类。
  • 更新您的services.yml
# src/My/Bundle/Resources/config/services.yml
parameters:
    atipik_hoa_web_socket.server.class: My\Bundle\WebSocket\Server

3.2.4 重写节点类

Hoa/Websocket允许您重写节点类以添加您自己的数据。

当然,此包允许您指定要使用哪个类

  • 创建一个扩展Hoa\Websocket\Node的节点类
<?php
# src/My/Bundle/WebSocket/Node.php
namespace My\Bundle\WebSocket;

class Node extends \Hoa\Websocket\Node
{
    protected $myData;

    public function getMyData()
    {
        return $this->myData;
    }

    public function setMyData($data)
    {
        $this->myData = $data;

        return $this;
    }

    public function doThingsWithMyData()
    {
        // ...
    }
}
  • 更新您的services.yml
# src/My/Bundle/Resources/config/services.yml
parameters:
    atipik_hoa_web_socket.node.class: My\Bundle\WebSocket\Node
  • 现在,您可以访问当前节点,即您的节点类的实例
<?php
# src/My/Bundle/WebSocket/Module/MyModule.php
namespace My\Bundle\WebSocket\Module;

use Atipik\Hoa\WebSocketBundle\WebSocket\Module\Module;

class MyModule extends Module
{
    // ...

    public function onEvent1()
    {
        // ...

        $node = $this->getNode();

        $node->setMyData('foobar');

        // ..
    }

    // ...

    public function onEvent2()
    {
        // ...

        $node = $this->getNode();

        $node->getMyData(); // contain 'foobar' set in event1

        // ..
    }

    // ...
}

4. 客户端

如果您想与WebSocket服务器通信,可以使用服务atipik_hoa_web_socket.client,通过在控制器中使用$this->get('atipik_hoa_web_socket.client')或在services.yml中直接注入此服务。

有关WebSocket客户端的更多文档,请参阅Hoa/WebSocket的文档

5. 运行单元测试

composer update
./vendor/bin/atoum

6. 更多文档

请参阅Hoa/WebSocket的文档以了解如何使用Hoa/WebSocket并查看JavaScript代码示例。