-
Notifications
You must be signed in to change notification settings - Fork 18
components data
-
datastring, array编码或解码的数据
-
modeint
位运算操作选项 0=解码 2=解码前去掉反斜杠 1=编码 2=编码后添加反斜杠
<?php /** * 返回编码解码后的数据 */ $data = '<script>"嗨"'; json_encode($data); //"<script>\"\u55e8\""$result = of_base_com_data::json($data, 1); //""\u003Cscript\u003E"嗨"" of_base_com_data::json($result, 0); //<script>"嗨"
//添加反斜线 $result = of_base_com_data::json($data, 1 | 2); //"\u003Cscript\u003E\"嗨\"" of_base_com_data::json($result, 0 | 2); //<script>"嗨"
-
data指定计算的数据
<?php //键的顺序不同结果相同 of_base_com_data::digest(array('a' => 1, 'b' => 2)); //ef8ba71070086c47bd785b4271d1fb54 of_base_com_data::digest(array('b' => 2, 'a' => 1)); //ef8ba71070086c47bd785b4271d1fb54
-
namestring锁通道标识
-
lockint文件加锁方式 1=共享锁, 2=独享锁, 3=解除锁, 4=非堵塞(LOCK_NB)
-
argvarray操作参数 {"space" : 命名空间, 默认"", 空间之间同名锁冲突}
<?php /** 成功返回true, 失败返回false 使用"2 | 4"方式尝试加独享锁 配置_of.com.data.lock调整分布式锁属性 / of_base_com_data::lock('group::demo', 2); //打开demo标识独享锁 of_base_com_data::lock('group::demo', 3); //关闭demo标识独享锁<!--
<?php /** * 通过配置_of.com.data.lock切换磁盘锁模式 * 默认files文件模式, 配置mysql模式的例子如下 * 在支持"READ UNCOMMITTED"的数据库中创建表结构 * 框架会克隆dbPool连接, 自动修改隔离级别 */ CREATE TABLE_of_com_data_lock_mysql
(nMd5
char(32) NOT NULL COMMENT '加锁名的md5',uuid
char(28) NOT NULL COMMENT '唯一排序, UUID方法生成, 锁操作使用',type
tinyint(1) NOT NULL COMMENT '加锁类型, 1=读锁, 2=写锁',mark
char(32) NOT NULL COMMENT '加锁代码生成的唯一标识, 代码定位',info
char(255) NOT NULL COMMENT '加锁名的前255备注信息', PRIMARY KEY (nMd5
,uuid
) USING BTREE, KEYidx_markSearch
(mark
,nMd5
) USING BTREE, KEYidx_typeSearch
(nMd5
,type
,uuid
) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='协同加锁表';//框架配置文件 _of.com.data.lock => array( //适配文件 of_accy_com_data_lock_xxx 'adapter' => 'mysql', //对应的配置 'params' => array( //多个_of.db连接池可分布, 类mysql数据库需支持"READ UNCOMMITTED"隔离级别 'dbPool' => array('default'), //是否使用变量方式, true=是(性能更高), false=否(类mysql不兼容时设置) "useVar" => true ) ) //监控锁信息, 首先要修改RU隔离级别, 然后通过SQL查询 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM `_of_com_data_lock_mysql`;</pre> --> </div> <h2 id="rule" class="bottomBorder arguement"> of_base_com_data::rule(&$data, $rule) <span class="fontSize">数据格式校验</span> </h2> <ul class="block"> <li> <div class="arguement bottomBorder">data<span>array</span></div> 待填充校验的数据 </li> <li> <div class="arguement bottomBorder">rule<span>array</span></div> 校验规则 <pre class="block">
{ 节点键, "."与""为关键词, "`"为转义字符的分割键名 : 参数结构如下, 字符串代表数组的type { "type" : 值的类型 数组=验证子节点键{ 子节点键 : 同"值的类型", ... }, "@"开头字符串=正则验证, 字符串=内置类型 "int" : 整形, argv参数 { "idem" : 类型一致, 默认false, "min" : 最小值, "max" : 最大值, } "float" : 包括整型的浮点型, argv参数 { "idem" : 类型一致, 默认false, "min" : 最小值, "max" : 最大值, } "text" : 包含数字类型文本, argv参数 { "min" : 最小长度, "max" : 最大长度 } "bool" : 布尔类型, argv参数 { "format" : 转换布尔, 默认=枚举方式["ok", "true", "success", "on", "yes", "done", 1] 转true, false=强制验证布尔类型, true=弱类型为true的均转true } "date" : 时间类型, argv参数 { "format" : 格式化样式, 默认="Y-m-d H:i:s", false=不格式, "min" : 最小时间, "max" : 最大时间, } "enum" : 枚举类型, argv参数 { "list" : 枚举列表, [有效字符串, ...] "min" : 最少选项, "max" : 最多选项, "mode" : 校验类型, null(默认)=不校验, true=数组格式, false=标量格式 } "mail" : 验证邮箱, argv无参数 "call" : 回调验证, null=验证成功, 其它=提示错误, argv参数符合回调结构, 接收参数 { "check" :&引用的验证数据 } "default" : 默认值, null=必存在, 其它=默认值 "keys" : 按顺序验证键名中各""的类型, 如"a..b..c."分别对应0~2的配置 [ null为不验证, type字符串验证类型(正则或内置), {"type" => 同"值的类型", "min" => 数组最小个数, "max" => 数组最大个数}, ... ], "argv" : 对应"值的类型"提供的参数 { } } }
<?php $data = array( 'user' => 'userName', 'captcha' => 'asdf', 'data' => array( 'mail' => '[email protected]', 'age' => '12' ), 'detail' => array( 'bbb' => array( 'b44' => '221' ), 'ddd' => array( 'a22' => '331' ), ) ); $error = of_base_com_data::rule($data, array( //文本类型切必须存在 'user' => 'text', //文本类型自动填充 'nick' => array('type' => 'text', 'default' => '昵称'), //文本类型限制长度 'captcha' => array('type' => 'text', 'argv' => array('min' => 3, 'max' => 3)), //验证子类型 'data.mail' => 'mail', //分组验证子类型 'data' => array( 'type' => array( //强制验证数据类型 'age' => array('type' => 'int', 'argv' => array('idem' => true)), //填充默认数据 'sex' => array('type' => 'text', 'default' => '男'), ) ), 'detail..' => array( 'keys' => array( //验证第一个""的键名全为"b"或"c" array('type' => '@^[bc]+$@'), //验证第二个"*"的键名以"a"+数字结构 array('type' => '@^a\d+$@'), ) ) ));echo '错误: '; print_r($error); /* 错误: Array ( [captcha] => Val illegal, should be text, length >= 3 and <= 3 : asdf [data.age] => Val illegal, should be int, strict type : 12 ) / echo '结果: '; print_r($data); / 结果: Array ( [user] => userName [captcha] => asdf [data] => Array ( [mail] => [email protected] [age] => 12 [sex] => 男 )
[nick] => 昵称
) */
手册地址 http://phpof.net/
- 入门指引
-
疑难解答
- 部署时会遇到的那些常见问题
简单却容易忽视 - 框架内置有哪些管理界面
生产模式进入界面需用 __OF_DEBUG__ - 如何定制不同的架构模式
通过配置入口文件中调度方法的参数即可 - 如何面向命名空间开发
of_xx 类可以按照命名空间方式调用 - 如何设置不同的部署模式
通过_of.debug设置 开发,测试,生产 模式 - 为什么控制层类文件要返回true
这是防止非法访问的方法之一 - 为什么传到视图层的变量会被编码
这是因为 XSS 安全防范的原因 - 为什么框架没有SQL构造器
因常规方案牺牲了性能又未很好解决问题 - 如何快速开发用户及权限管理功能
单点登录(SSO)模块因此而存在 - 怎么在系统的基础上扩展底层功能
三点: 扩展开发, 预先加载, 底层钩子 - 怎么使用 Composer 依赖管理工具
框架已集成, 默认关闭状态
- 部署时会遇到的那些常见问题
- 组件使用
- 集成插件
- 扩展开发
- 开发手册