## 规则模式说明
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})?$/
直接配置到数据库中即可
D 模式:主要用于依赖必填模式,比如 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
```