基于laravel校验规则引擎

前情说明

笔者在开发一套流程引擎,在过程中发现对于大表单的数据校验几乎没有,laravel自带的如果对每个表单都独立写太麻烦,故而百度各种,最好的也只是在代码中定义规则描述性语句进行解析,不满足。良久思考决定还是自己写一个基于laravel的数据校验型的规则引擎。

规则模式说明

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

题外话

此代码还未发布,如需授权使用(可版权移交发布packlist),请联系:2319048747@qq.com
配套流程引擎,还在界面完善中,后续出体验版流程引擎,支持流程图绘制,审核,分流,汇流,审核等流程基础功能。非客户使用(说明,该版本流程引擎只支持公司开发或实时使用)
基于laravel流程引擎,支持表单设计,数据表设计,流程设计,报表设计等工作流;
定位于公司实施或开发,非直接暴露于客户,让信息“活”起来,让信息管理系统变成管理信息系统。
演示地址:wf.jishulincs.cn/
欢迎授权使用或版权购买

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!