数据校验

YY框架把一切数据的校验全部集成在模型之中,这样可以有效的做到逻辑规则和限定规则的分离。 数据校验的实现是通过继承模型类并实现validate方法实现的。

集成在模型中的数据校验有一个更加出色的功能,那就是前后台校验的统一。 一旦在validate中定义好字段的校验规则,前台页面的的js适配器会自动针对校验规则实现js数据验证方法。

注意:好的开发人员不会轻易相信来自前台的任何数据,所以即使有JS校验后台的数据校验也是必须的。

通用校验方法

val_chinese

SampleModel::val_chinese(string $field, string $errmsg) 
字段是否为中文的验证

Parameters: 
string $field 字段名称 
string $errmsg 错误信息

val_eamil

SampleModel::val_eamil(string $field, string $errmsg) 
字段Email格式合法性验证

Parameters: 
string $field 字段名称 
string $errmsg 错误信息

val_english

SampleModel::val_english(string $field, string $errmsg) 
字段是否为英文和数字的验证

Parameters: 
string $field 字段名称 
string $errmsg 错误信息

val_integer

SampleModel::val_integer(string $field, string $errmsg) 
字段是否为整数的验证

Parameters: 
string $field 字段名称 
string $errmsg 错误信息

val_max_length

SampleModel::val_max_length(string $field, integer $max, string $errmsg) 
字段最大长度的验证

Parameters: 
string $field 字段名称 
integer $max 允许的最大长度 
string $errmsg 错误信息 {0}替换为$max

val_min_length

SampleModel::val_min_length(string $field, integer $min, string $errmsg) 
字段最小长度的验证

Parameters: 
string $field 字段名称 
integer $min 允许的最小长度 
string $errmsg 错误信息{0}替换为$min

val_notnull

SampleModel::val_notnull(string $field, string $errmsg) 
字段非空验证

Parameters: 
string $field 字段名称 
string $errmsg 错误信息

val_number

SampleModel::val_number(string $field, string $errmsg) 
字段是否为数字的验证

Parameters: 
string $field 字段名称 
string $errmsg 错误信息

val_tel

SampleModel::val_tel(string $field, string $errmsg) 
字段国内电话号码格式合法性验证

Parameters: 
string $field 字段名称 
string $errmsg 错误信息

val_url

SampleModel::val_url(string $field, string $errmsg) 
字段url合法性验证

Parameters: 
string $field 字段名称 
string $errmsg 错误信息

val_reg

SampleModel::val_reg(string $field, string $reg, string $errmsg, string $regjs) 
字段的自定义正则表达式验证

Parameters: 
string $field 字段名称 
string $reg 正则表达式 
string $errmsg 错误信息 
string $regjs 字段的前台js信息的验证规则

val_unique

Model::val_unique(string $field, string $errmsg) 
字段的 唯一性验证

Parameters:  
string $field 字段名称   
string $errmsg 错误信息

注意&提醒:

1、val_unique方法只能在自定义的数据库模型中使用,因为这个方法的验证是需要经过数据检索的,简单模型没有这个验证功能。

2、val_unique验证设置之后无论模型的新增或更新都会触发这个验证,数据新增时会对全表数据进行唯一性验证,更新时会对除了当前数据之外的其他数据进行唯一性验证。

2、除了val_reg方法外,其他参数的错误信息除了直接传入外还可以在国际化配置文件里配置中文的配置文件名称为zh-cn_validate.php

zh-cn_validate.php文件内容:

<?php
return array(
    'email' => '邮箱格式不正确',
    'unique' => '信息重复',
    'url' => '错误的网络地址',
    'number' => '此项必须为数字',
    'integer' => '此项必须为整数',
    'chinese' => '此项必须为中文和数字',
    'english' => '此项必须为英文和数字',
    'short' => '长度不能少于{0}位',
    'long' => '长度不能大于{0}位',
);

自定义验证规则

开发者要实现复杂的数据校验可以通过自定义正则表达式(val_reg)实现,但是某些情况下,出于一些特殊的需求可能单纯的正则表达式无法完成数据的有效性验证。 这个时候我们可以在validate方法中通过自定义验证逻辑来实现复杂验证。

方法实例:

/**
* 数据入库之前的合法性验证
*/
public function validate(){
    $this->val_eamil('email','电子邮箱格式不正确!');
    $this->val_min_length('un', 3,'帐号长度不能小于3个字符!');
    $this->val_max_length('un', 50,'帐号长度不能大于于50个字符!');
    $this->val_max_length('pwd', 50,'密码长度不能大于于50个字符!');
    $this->val_min_length('pwd', 3,'密码长度不能小于3个字符!');
    $this->val_unique('un','该用户名已经被注册!');
    $this->val_url('net','网址信息不正确!');
    $this->val_tel('phone','电话号码格式不正确!');

    //下面为自定义的逻辑验证

    if($this->nickname == 'yyuc' && $this->nickname == 'laravel'){
        $this->set_err_msg('nickname','请不要使用我们钟爱的昵称');
    }
}

注意:通过set_err_msg方法自定义的错误校验结果,只能在后台获取;无法同步到前台页面通过框架的JS适配器完成校验。所以前台的校验脚本需要开发者自己完成。

校验结果的获取

后台获取

在自定义的数据库模型中校验是在save方法中自动被触发的。如果信息校验失败,save方法返回false退出,并不会把信息写入到数据库中。

在自定义的简单模型中,需要开发者调用validate方法完成信息字段的校验,当然在自定义的数据库模型中也是可以直接调用validate方法的。

无论是哪种方式调用validate方法,如果校验失败,错误信息都会被存储到模型中,我们可以通过以下几个方法获取。

errors

SampleModel::errors() 
获得模型的验证错误信息数组
这是一个以字段名称为数组下标的二维数组没有则返回空数组

Returns:
  array 错误信息数组 

field_error

SampleModel::field_error(string $field) 
获得某一字段的验证错误信息数组
返回该字段的验证错误信息,没有则返回空数组

Parameters: 
string $field 字段名称

Returns:
  array 错误信息数组 

field_errors

SampleModel::field_errors(string $field) 
获得某一字段的验证错误信息字串(','分隔)
返回该字段的验证错误信息,没有则返回空串

Parameters: 
string $field 字段名称

Returns:
  string 错误信息 

前台获取

前台表单项的验证错误信息可以通过2种方法获取:

1、单项获取:

//弹出表单项校验的所有错误信息
$('#theid').tovalidate(function(errs){
    if(errs === false){
        alert('这个字段不准为空');
    }else if(errs !== true){
        for(var i=0; i<errs.length;i++){
            alert(errs[i]);
        }
    }       
});

2、整个Form表单错误信息获取

$('form').validate(function(m){
    if(m.length>0){
        for(var i=0;i<m.length;i++){
            //m[i].e为验证错误的表单元素
            //m[i].m该单元的错误信息(非空错误为false,其他为信息数组)

            $(m[i].e).after('<span class="error">'+(m[i].m===false?'该项内容不能为空':m[i].m.join(','))+'</span>');
        }
    }else{
        $('form').submit();
    }
});

提示:如果你读不懂上面两段错误信息获取的代码,请学习使用Jquery