## 规则模式说明 1. 基于数据库规则配置 2. 四中分类校验 3. 支持扩展 4. 支持多记录校验 5. 适用小型表单校验,主大表单校验 6. 上手容易,未做扩展包发布 (可发布) ## 规则设计 数据表 ``` CREATE TABLE `yw_lrules` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `LR_KEY` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '基于规则获取分组的KEY值', `LR_GROUP` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '内置分组类型[D,E,F,G]', `LR_COL` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字段名称', `LR_LABEL` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '标签名', `LR_DESC` varchar(300) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '提示全称(自定义)', `LR_REQUIRED` tinyint(4) NOT NULL DEFAULT '0' COMMENT '必填[1=是,0=否]', `LR_RULES` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '规则配置(混合模式,详见文档)', `LR_STATUS` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态[1=启用,0=禁用]', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ``` 表字段说明: LR_KEY:外部值,主要用于规则筛选; LR_GROUP:系统内置分组类型 D: 系统内置规则 [自定义扩展规则] E: 正则,直接输入正则规则 F:依赖模式 G: 全局模式 LR_COL:字段名称,格式如 (单记录:main.name,main.user.idcard,多记录:file.*.size) LR_LABEL:字段提示名(如果没有 desc 则系统内置提示) LR_DESC:自定义描述 LR_REQUIRED:字段是否必填 LR_RULES:规则集(稍后介绍) LR_STATUS:是否启用 模式介绍: 数据格式如下: ``` $list = [ 'main' => [ 'zgjob02' => [ 'NAME' => '呵呵', 'ZGJOB020001' => '采购部门', 'ZGJOB020002' => '362330xxxxxxxxxxx', 'ZGJOB020003' => '0', ], ], 'zgjob03' => [ 'ZGJOB02030001' => '12', 'ZGJOB02030002' => '12.36', 'ZGJOB02030003' => '12.003', 'ZGJOB02030004' => '20.3', 'ZGJOB02030005' => '', ], 'zgjob08' => [ ['aaa' => '111.2112', 'bbb' => '333.12'], ['aaa' => '222.022', 'bbb' => '444'], ], ]; ``` ``` D 模式:主要用与系统内置规则和自定义规则 数据库配置如下: LR_GROUP:D LR_COL:main.zgjob02.NAME LR_LABEL:姓名 LR_DESC:’’ LR_REQUIRED:1 LR_RULES:chs|minone:2|maxone:20 D 模式的规则配置说明:chs 表示只能属于中文,minone 表示最小字符,maxone 表示最大字符,每个规则通过 “|” 分割,需要额外比较参数通过 “:” 携带,多个参数通过 “,” 分割,详细规则后续说明 E 模式:主要用于直接的系统未内置的正则表达式 如:LR_RULES:/^-?[0-9]+(.[0-9]{1,2})?$/ 直接配置到数据库中即可 F 模式:主要用于依赖必填模式,比如 A 如果必填必须 B 等于多少或其他 如:LR_RULES:({main.zgjob02.ZGJOB020003} <= 23 && !in_array (‘{zgjob03.ZGJOB02030001}’, [11,12,3])) || (‘{zgjob03.ZGJOB02030004}’ != ‘20’) 里面的参数值通过 “{}” 包裹,系统解析规则条件是否满足判断 G 模式:主要用于复杂逻辑判断,系统无法支持,可通过自定义方式扩展自行编写处理 如:LR_RULES:App\Http\Controllers\WF\Stateless\JishulinController|testValidate01 “|” 分割,第一个为类,第二个为方法,方法的参数第一个为校验数据,第二个为外部带入(后续说明) ``` ## 如何扩展规则 系统默认扩展类为:App\\Extend\\ExpandRules 如果不用系统自带的,需要在 app 配置文件中,指定 rule=>’App\\Test’自己的扩展类名即可 示例如下: ``` <?php namespace App; class Test { // 参数说明 // val 被校验值 // label 字段名 // desc 自定义描述 // limitVal 比较参数值 public function checkAaa($val, $label, $desc, $limitVal = null) { // 校验通过 return true; // 不通过 return [ 'error' => 1, 'message' => '校验不通过' ]; } } ``` 校验成功需返回 “true”,校验不通过需返回上述格式。其中 G 模式校验返回如果成功返回格式为 \[‘error’ => 0\], 不通过一样,注意两者区别。 ## 系统内置规则 ``` // 规则如下配置 // 检验是否必填完整[$limitVal=1必填校验,否则不做校验] required => required:1 // 校验中文汉字 chs => chs // 【解析中文字符为3个字符长度】判断字符长度最小值不能小于$limitVal(不含等于) min => min:10 // 【解析中文字符为3个字符长度】判断字符长度最大值不能大于$limitVal(不含等于) max => max:20 // 【解析中文字符为1个字符长度】判断字符长度最小值不能小于$limitVal(不含等于) minone => minone:10 // 【解析中文字符为1个字符长度】判断字符长度最大值不能大于$limitVal(不含等于) maxone => maxone:10 // 身份证规则校验 idcard => idcard // 纯数字,没有+-符号及小数点等 number => number // 浮点数,最多含一位小数点 float1dot => float1dot // 浮点数,最多含两位小数点 float2dot => float2dot // 浮点数,指定小数点位数 float => float:4 // 身份证号码[正则校验] idcardreg => idcardreg // 手机号码格式 mobile => mobile // 只能是汉字、字母、数字和下划线_及破折号- chsdash => chsdash // 只能是汉字、字母和数字 chsalphanum => chsalphanum // 是汉字、字母 chsalpha => chsalpha // 字母和数字,下划线及破折号 alphadash => alphadash // 字母和数字 alphanum => alphanum // 纯字母,含大小写 alpha => alpha // 指定等于(限制为)某个值 equal => equal:120 equal => equal:sss // 判断字符长度在两者之间(中文算3个字符) length => length:10,30 // 判断字符长度在两者之间(中文算1个字符) lengthone => lengthone:10,30 // 判断数字在两者之间 between => between:10,90 // 判断数字不在两者之间 notbetween => notbetween:1,10 // 正则校验在其中 regex => regex:/^-?[0-9]+(.[0-9]{1,2})?$/ // 正则校验不在其中 notregex => notregex:/^-?[0-9]+(.[0-9]{1,2})?$/ // 是否是日期格式[yyyy-mm-dd HH:ii:ss,yyyy-mm-dd HH:ii][yyyy-mm-dd,yymmdd,yyyy/mm/dd] datetime => datetime // 日期指定格式校验[ymd,y-m-d,y/m/d] // ymd,ymdhi,ymdhis // y-m-d,y-m-d-h-i,y-m-d-h-i-s // y/m/d,y/m/d/h/i,y/m/d/h/i/s dateformat => dateformat:ymd // 电话座机格式 phone => phone // 电话座机区号格式 phonearea => phonearea // 电话座机格式或手机号码格式 tel => tel // 邮政编码格式 post => post ```