nikovonlas / yii2sockets
为 Yii2 提供的 Node.js web-sockets 支持
Requires
Requires (Dev)
- yiisoft/yii2-codeception: ~2.0
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)
-
基本(YiiNodeSocketFrameBasic),用于基本消息。
-
jQuery(YiiNodeSocketFrameJQuery),用于 jQuery DOM 操作。
-
通知(YiiNodeSocketFrameGrowl),使用
kartik-v/yii2-widget-growl
显示用户消息。 -
警报(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 帧类型,该类型根据其内容发送消息
- 到
recipient_id
和author_id
(如果对象包含这两个属性); - 否则,自动组成
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);
};