nikovonlas/yii2sockets

为 Yii2 提供的 Node.js web-sockets 支持

安装: 10

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 4

公开问题: 0

语言:JavaScript

类型:yii2-extension

1.0.10.0 2018-07-15 14:28 UTC

This package is auto-updated.

Last update: 2024-09-16 22:01:18 UTC


README

Node.js 服务器集成模块(web-sockets)

使用 composer 安装

composer require nikovonlas/yii2sockets:1.*

将控制台命令控制器添加到配置(controllerMap 部分

'controllerMap' => [
    ...
    'node-sockets' => '\nikovonlas\yii2sockets\commands\YiiNodeSocketsController',
    ...
],

将会话组件添加到主配置的 'components' 部分

'components' => [
    ...
        'session' => [
            'class' => 'nikovonlas\yii2sockets\YiiNodeSocketSession',
            'keyPrefix' => 'sess_preffix_',
            'timeout' => 600,
        ],
    ...
]

它使用 Redis 数据库连接与 Node.js 服务器共享会话数据。当然,你必须使用 Redis 组件来连接 Redis 数据库。在两个配置(web 和主)中添加它。

'components' => [
    ...
        'redis' => [
            'class' => 'yii\redis\Connection',
            'hostname' => 'localhost',
            'port' => 6379,
            'database' => 0,
        ],
    ...
]

并且将组件添加到这些配置中(https 尚未实现

'components' => [
    ...
        'nodeSockets' => [
            'class' => 'nikovonlas\yii2sockets\YiiNodeSocket',
            'nodeJsHost' => 'localhost',
            'nodeJsPort' => 3001,
            'nodeJsScheme' => 'http',
            'nodeJsHostClient' => 'your-site.com',
            'serviceKey' => 'serviceKeyUsedForCommunication',
            'sessionKeyPrefix' => 'sess_preffix_',
            'channelsByPermissions' => [
                'channel_name' => 'permission',
                'channel_name_2' => [
                    'permission' => '@',
                    'url' => '/chat/index',     //URL on which users can connect to channel
                ],
            ],
        ],
    ...
]

参数 channelsByPermissions 是一个包含频道名称和权限的数组。如果 Yii::$app->user->can('permission') 返回 TRUE,则频道 channel_name 将自动添加到用户。它在组件初始化时运行。

配置准备就绪后,使用控制台命令构建 Node.js 配置文件

./yii node-sockets/init

Node.js 服务器

服务器位于 server 子目录中。在第一次运行之前,你必须安装所有 Node.js 模块。转到 server 目录并使用以下命令安装它们

npm install

现在你可以运行服务器

node app.js

你可以使用环境变量来覆盖配置选项。例如

NODE_ENV=production node app.js

在这种情况下,它以生产模式运行,禁用了调试信息。

消息

有 3 个消息类(我称之为 Frames)

  1. 基本(YiiNodeSocketFrameBasic),用于基本消息。

  2. jQuery(YiiNodeSocketFrameJQuery),用于 jQuery DOM 操作。

  3. 通知(YiiNodeSocketFrameGrowl),使用 kartik-v/yii2-widget-growl 显示用户消息。

  4. 警报(YiiNodeSocketFrameAlert),播放音频警报给用户。

示例

向频道 test_channel 发送带有数组 [] 体的消息。在前端将使用 JavaScript 回调 jsCallbackName

Yii::$app->nodeSockets->newMessage()
    ->setBody([
        'id' => $model->id,
        'message' => Yii::t('app', 'You have new incoming call'),
    ])
    ->setChannel('test_channel')
    ->setCallback('jsCallbackName')
    ->send();

向此套接字发送消息(示例用于 AJAX 请求)。

Yii::$app->nodeSockets->newNotify()
    ->setOptions([
        'allow_dismiss'     => true,
        'showProgressbar'   => true,
        'placement'         => [
            'from'  => 'bottom',
            'align' => 'right'
        ]
    ])
    ->setText('Hello world')
    ->sendToThis();

向具有 ID 1 的用户发送 jQuery 帧。它将删除具有选择器 #element_selector 的元素。

Yii::$app->nodeSockets->newJQuery()
    ->remove('#element_selector')
    ->setUser(1)
    ->send();

向所有浏览器窗口(包括非活动窗口)的 test_channel 频道发送警报帧

Yii::$app->nodeSockets->newAlert()
    ->setAudioId('audio_element_id')
    ->setChannel('test_channel')
    ->onlyActiveWindow(false)
    ->send();

请注意,你必须渲染包含 <audio> 元素的块才能播放它。

还包括示例 YiiNodeSocketFrameChat 帧类型,该类型根据其内容发送消息

  1. recipient_idauthor_id(如果对象包含这两个属性);
  2. 否则,自动组成 channel。你可以查看帧源以获取详细信息。
$message = new ChatMessage([
    'recipient_id' => 4,
    'author_id' => 1,
    'message' => 'test text message',
]);

Yii::$app->nodeSockets->newChat()
    ->setMessage($message)
    ->send();

JavaScript 回调示例

YiiNodeSockets.callbacks.jsCallbackName = function (message, _socket) {
    console.log(message.body);
};