## 規則模式說明
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
```