+ -
当前位置:首页 → 问答吧 → 智能的数据验证spVerifier教程三,创建自己的验证规则

智能的数据验证spVerifier教程三,创建自己的验证规则

时间:2009-12-13

来源:互联网

前面我们已经介绍了spVerifier的规则验证及信息提示方法,接下来我们继续开发spVerifier的能力,在验证中加入自己创建的验证规则。
首先我们看一下例子

复制代码
  1. class user extends spModel
  2. {
  3.     public $pk = 'uid';
  4.     public $table = 'user';
  5.     // 我们定义自己的验证规则
  6.     var $addrules = array(
  7.         // 自定义验证规则的函数名可以有两种形式
  8.         // 第一种是 '规则名称' => '验证函数名',这是当函数是一个单纯的函数时使用
  9.         // 第二种是‘规则名称’=> array('类名', '方法函数名'),这是当函数是一个类的某个方法函数时候使用。
  10.         'youare' => 'checkname', //  '规则名称' => '验证函数名'
  11.         'is_phone' => array('user', 'check_phone'), //‘规则名称’=> array('类名', '方法函数名')
  12.         // 当然我们还可以定义更多的自定义规则
  13.     );
  14.     var $verifier = array(
  15.         "rules" => array( // 规则
  16.             'username' => array(
  17.                 'notnull' => TRUE,
  18.                 'minlength' => 5,
  19.                 'maxlength' => 12,
  20.                 'youare' => 'jake' // 加入了新的验证规则和验证值
  21.             ),
  22.             'phone' => array( // 这里要验证手机号
  23.                 'notnull' => TRUE,
  24.                 'is_phone' => TRUE, // 自定义的手机号验证规则
  25.             ),
  26.         ),
  27.         "messages" => array( // 提示信息
  28.             'username' => array(
  29.                 'notnull' => "姓名不能为空",
  30.                 'minlength' => "姓名不能少于5个字符",
  31.                 'maxlength' => "姓名不能大于20个字符",
  32.                 'youare' => "看来你不是jake", // 这里是规则不通过时的提示
  33.             ),
  34.             'phone' => array(
  35.                 'notnull' => "手机号不能为空",
  36.                 'is_phone' => "请填写正确的手机号",
  37.             ),
  38.         )
  39.     );
  40.     // 这里是user类的check_phone方法函数
  41.     // 请注意,自定义验证规则的函数,参数务必是($val, $right)
  42.     function check_phone($val, $right){
  43.         if( is_numeric($val) && strlen($val) == 11 ){
  44.             return TRUE; // $right是等于TRUE的
  45.         }else{
  46.             return FALSE; // 也就是 !$right
  47.         }
  48.     }
  49. }
  50. // 这里是独立的函数checkname
  51. // 它的参数同样也必须是($val, $right)
  52. function checkname($val, $right){
  53.     if( $val == $right ){ // 当$val(输入值)等于$right(正确值)的时候,返回TRUE;
  54.         return TRUE; // 返回TRUE则通过验证
  55.     }else{
  56.         return FALSE; // 返回FALSE则无法通过验证
  57.     }
  58. }

下面我们来详细说明一下创建自定义验证规则的过程:
一、首先我们需要在user类(spModel继承类)中,设置$addrules,这样就能定义我们的自建规则的处理函数了。$addrules是一个数组,数组项的键是规则名称,值就是一个规则处理函数的定义。定义的函数可以有两种形式:
第一种是 '规则名称' => '验证函数名',这是当函数是一个单纯的函数时使用
第二种是‘规则名称’=> array('类名', '方法函数名'),这是当函数是一个类的某个方法函数时候使用。
复制代码
  1. var $addrules = array(
  2.         'youare' => 'checkname', //  '规则名称' => '验证函数名'
  3.         'is_phone' => array('user', 'check_phone'), //‘规则名称’=> array('类名', '方法函数名')
  4.     );


这里就已经定义了youare和is_phone两个规则,youare的处理函数是独立函数checkname(),而is_phone的处理函数是user类的check_phone方法。
二、写作处理函数的代码。我们先看看checkname()的代码:
复制代码
  1. // 这里是独立的函数checkname
  2. // 它的参数同样也必须是($val, $right)
  3. function checkname($val, $right){
  4.     if( $val == $right ){ // 当$val(输入值)等于$right(正确值)的时候,返回TRUE;
  5.         return TRUE; // 返回TRUE则通过验证
  6.     }else{
  7.         return FALSE; // 返回FALSE则无法通过验证
  8.     }
  9. }


正如注释内说明的一样,处理函数的参数必须是($val, $right),它们分别代码了输入的字符($val),正确的字符($right)。
请注意,spVerifier同时还提供了第三个参数$values。以下两种写法都是正确的:
function checkname($val, $right){
或者
function checkname($val, $right, $values){
$values是一个数组,主要的作用是保存了其他的输入字符,当自建的验证函数需要到其他的输入字符时,就可以直接使用$values。比如说在验证用户籍贯时,用户同时输入了省份和城市,那么在验证城市的时候,也是需要获取省份进行共同验证的。
spVerifier规定了规则处理函数必须返回TRUE或者FALSE,返回TRUE是通过了验证,返回FALSE是无法通过验证。
如果函数返回的并非TRUE/FALSE,那程序有可能判断成非FALSE,即是TRUE的,所以请严格的控制规则处理函数仅返回TRUE/FALSE。
规则处理函数同时也可以是类的方法函数:
复制代码
  1. class user extends spModel
  2. {
  3.     // 这里是user类的check_phone方法函数
  4.     // 请注意,自定义验证规则的函数,参数务必是($val, $right)
  5.     function check_phone($val, $right){
  6.         if( is_numeric($val) && strlen($val) == 11 ){
  7.             return TRUE; // $right是等于TRUE的
  8.         }else{
  9.             return FALSE; // 也就是 !$right
  10.         }
  11.     }
  12. }


与user::is_phone的调用形式不同,规则处理函数在调用类方法的时候,是使用spClass(user)->is_phone(…)形式的,这样调用有利于对象的初始化。
上面介绍了如何创建自己的验证规则,那么现在我们可以自己动手试试,比如建立一个验证用户名是否重复的规则,或建立一个过滤留言中不良词语的规则吧。

本文地址:http://speedphp.com/post/spverifier-create-rules.html

作者: jake   发布时间: 2009-12-13