验证规则的定义通常有三种方式,如果你使用了验证器的话,通常通过constructor构建函数中的super()方法或者修改类属性来定义验证规则,而如果使用的是独立验证的话,则是通过setRule方法进行定义。

# super定义










 



class LoginValidate extends Validate
{
    constructor()
    {
        const rules = {
            'user'  : 'require|mail|max:30',
            'pass'  : 'require|chsDash|length:6,16'
        }
        
        super(rules)
    }
}

# 修改类属性



 
 
 
 


class LoginValidate extends Validate
{
    rule = {
        'user'  : 'require|mail|max:30',
        'pass'  : 'require|chsDash|length:6,16'
    }
}

WARNING

系统内置了一些常用的验证规则可以满足大部分的验证需求,具体每个规则的含义参考内置规则一节。

一个字段可以使用多个验证规则(如上面的user字段定义了requiremaxmail三个验证规则)

# 方法定义

如果使用的是独立验证(即手动调用验证类进行验证)方式的话,通常使用setRule方法进行验证规则的设置,举例说明如下。












 





$data = {
    'user' : 'admin@admin.com',
    'pass' : '123456'
};

const rules = {
    'user'  : 'require|mail|max:30|diy:1111',
    'pass'  : 'require|chsDash|length:6,16'
};

const login = new Validate();
login.setRule(rules)

if(!login.check($data)){
    console.log(login.getError())
}

# 自定义验证规则

系统内置了一些常用的规则(参考后面的内置规则),如果不能满足需求,可以在验证器重添加额外的验证方法,例如:

class User extends Validate
{
    constructor(){
        const rules = {
            'name'  : 'require|check_name:michael',
            'email' : 'mail'
        };
        const message = {
            'name.require' : '用户名必须填写',
            'email.mail'   : '填入的邮箱不是有效的电子邮件地址'
        }
        super(rules,message)
    }

    check_name(value, rule, data = {})
    {
        return value === rule ? true : '用户名错误';
    }
}

验证方法可以传入的参数共有4个(后面两个根据情况选用),依次为:

  • 验证数据
  • 验证规则
  • 全部数据(数组)
  • 其他数据(数组)如check_name:michael:1:2 此处为除去michael以外的1,2数据

有时候我们需要对这么自定义验证方法进行一些复用,这时候就需要自定义一个验证器

class UserRule extends BaseValidateRule{
    check_name(value, rule, data = {})
    {
        return value === rule ? true : '用户名错误';
    }
}

然后在Validate验证器中将这个类注册到进去

this.register(new UserRule)

# 自定义正则规则

实例化一个规则器,然后预定义一个或多个正则规则

const v = new Validate()
let validator = new BaseValidator()

或者可以使用验证器内默认的规则器

let validator = v.getValidator()
validator.setRegex({
    "qq":/[1-9][0-9]{4,}/
});

记得注册到验证器中才会生效(如果是从验证器内获取的无需注册)

v.register(validator)

然后就可以和其他规则一样使用

v.setRule({
    "value" :"qq"
});
v.setMsg({
    "value.qq"  :"请输入正确的QQ格式"
});

# 复杂条件验证

有时候你可能需要增加基于更复杂的条件逻辑的验证规则。例如,你可以希望某个指定字段在另一个字段的值超过 100 时才为必填。或者当某个指定字段存在时,另外两个字段才能具有给定的值。增加这样的验证条件并不难。首先,使用 静态规则 创建一个 Validate 实例:

let v = Validate.make({
    "age" : 'require|number',
})

假设我们提供了一个个人信息登记的软件,如果年龄没有超过150岁,则默认为人类,如果超过了150岁,则需要用户必须填写物种,为了在特定条件下加入此验证需求,可以在 Validate 实例中使用 sometimes 方法

v.sometimes("species","require|chsAlpha",function (data) {
    return data.age > 150; 
})

传入 sometimes 方法的第一个参数是要用来验证的字段名称。第二个参数是我们想使用的验证规则。 闭包 作为第三个参数传入,如果其返回 true , 则额外的规则就会被加入。这个方法可以轻松地创建复杂的条件验证。你甚至可以一次对多个字段增加条件验证:

v.sometimes(["species","planetName"],"require",function (data) {
    return data.age > 150; 
})