#1 jake

在日常的开发中,我们经常会遇到针对输入数据的格式验证,比如说检查用户名的长度,电子邮件的格式等等。一般来说我们是使用验证函数库的形式来提高写作数据验证程序的效率,但是在这里我们介绍sp框架中比验证函数库更为有效和简便的数据验证功能类——spVerifier。

spVerifier是spModel的附属类之一,根据预设的验证规则来对数据进行有效性的验证。按照规则进行数据验证,有利于对验证程序的重用,如对用户名的验证,基本上在各类型的应用程序中是类似的,所以将一个程序中用户名的验证规则直接复制到另一个程序的用户名验证规则中,那样就可以完成了第二个程序对用户名的验证了。

spVerifier的验证规则分成两部分,分别是规则与提示信息,本章先介绍验证规则和一些spVerifier类自带的验证方法。

我们还是以用户名和电子邮件的验证作为例子,我们在一个应用程序需要验证用户名和电子邮件,比较一般的情况就是检查用户名不能长于12个字符也不能少于5个字符,电子邮件首先是要符合电子邮件的格式,同时也不能长于20个字符和少于8个字符。

请注意,在spVerifier中针对汉字的长度判断进行了特殊的处理,令到判断最长和最短的字符的时候,英文和汉字是相等长度的。也就是“Hello”和“我是用户名”的长度都是5。这样的处理避免了许多应用程序中需要向用户解释“一个汉字等于2或者3个英文字符长度”的问题。
根据以上的限制,我们在用户的模型类中写出了以下的验证规则。由于spVerifier是spModel的附属类之一,同时数据验证也是在系统模型部分的要点之一,所以spVerifier的验证都是通过spModel的继承类来进行的。
class user extends spModel // 这是一个继承了spModel的数据类
{
        public $pk = 'uid';
        public $table = 'user';
   // 定义验证规则
        var $verifier = array(
                "rules" => array( // 规则
                        'username' => array(  // 这里是对username的验证规则
                                'notnull' => TRUE, // username不能为空
                                'minlength' => 5,  // username长度不能小于5
                                'maxlength' => 12, // username长度不能大于12
                        ),
                        'email' => array(   // 这里是对email的验证规则
                                'notnull' => TRUE, // email不能为空
                                'email' => TRUE,   // 必须要是电子邮件格式
                                'minlength' => 8,  // email长度不能小于8
                                'maxlength' => 20, // email长度不能大于20
                        ),
                ),
        );
}               
执行验证的程序:
$userObj = spClass('user');
        // 待检验的输入参数,一般来说可以直接使用$this->spArgs();来获取提交的输入数据
        $args = array(
                'username' => 'one' // 只有三个字符
        );
        dump($userObj->spVerifier($args));       
输出的结果:
Array
(
    [username] => Array
        (
            [0] => minlength
        )

    [email] => Array
        (
            [0] => notnull
            [1] => email
            [2] => minlength
        )
)               

由输出的结果我们可以看到,username不符合minlength的规则,而email不符合notnull和minlength的规则。

请注意spVerifier的返回值!

返回TRUE时,代表输入的数据格式并非数组,不能进行验证。

返回数组时,代表着验证不能通过,数组内容则是提示信息。

只有返回FALSE时,才是数据已经通过验证。

所以我们可以用以下形式来作为提交数据的输入判断:

if( false == $userObj->spVerifier($this->spArgs()) ){
// 通过验证后执行的...
to do;
}else{
// 不能通过验证
to do;
}
       

上例中的notnull和minlength都是spVerifier自带的检验规则,下面是全部的自带验证规则表:

notnull 判断字符非空,即使字符没有赋值,也是不能通过验证的。

minlength 限制字符最小长度,只有当字符长度等于或大于该长度才能通过验证。同时请注意minlength对汉字和英文的长度判断都是一样,“He我们llo”是7个字符。

maxlength 限制字符最大长度,只有当字符长度等于或小于该长度才能通过验证。同时请注意maxlength对汉字和英文的长度判断都是一样,“He我们llo”是7个字符。

istime 检验字符是否符合时间格式,比如“2009-10-27 9:19:12”将是正确的时间格式。

email 检验字符是否符合电子邮件格式。

equalto 判断字符是否等于另一个输入字符,equalto的检验是很常见的,比如很多网站注册时都需要检验两次输入的密码是否相同,就是用equalto规则,具体用法如下:

// 规则
                "rules" => array( // 规则
                        'password' => array(  // 这里是对密码的验证规则
                                'notnull' => TRUE, // 密码不能为空
                                'minlength' => 5,  // 密码长度不能小于5
                                'maxlength' => 12, // 密码长度不能大于12
                        ),
                        'comfirm_password' => array(  // 这里是对第二次输入的密码的验证规则
                                'equalto' => 'password', // 要等于'password',也就是要与上面的密码相等
                        ),               

上面已经介绍了sp框架的数据验证spVerifier的一些基本应用。

接下来第二章,我们开始用友好的提示美化一下这些验证规则,以改善用户体验。(比如说username不符合notnull规则时,就返回中文提示说“用户名不能为空”)

同时,我们可以使用的验证规则,并不只spVerifier自带规则,它还提供了强大的接口让我们可以自己创建验证规则,比如用户注册时检查用户名是否存在的规则,这些我们都在第三章介绍。


2012-08-04 16:44:10