验证规则重复使用方法

#1 xuechu

如果规则里面有两个字段需要验证,但是当前只想验证其中一个字段,我做了如下修改(不知道是我自作聪明,还是JACK已有相应的调用方法),做个记号。
规则:
 
  "rules" => array(
   'id' => array(
    'notnull' => TRUE,
   ),
   'email' => array(
    'notnull' => TRUE,
    'email' => true,
   ),
  ),



如我只想验证id,调用方法

 
spVerifier(array('id'=>$id),null,array('morerow'=>true));


修改验证类:
/core/spModel.php
 
    public function __input(& $obj, $args){
  //添加只验证规测里面的一项
  $morerow=false;
  if(isset($args[2]) && is_array($args[2])){if($args[2]['morerow'])$morerow=true;}  
  
  $this->verifier = (null != $obj->verifier) ? $obj->verifier : array();
  if(isset($args[1]) && is_array($args[1])){
   $this->verifier["rules"] = $this->verifier["rules"] + $args[1]["rules"];
   $this->verifier["messages"] = isset($args[1]["messages"]) ? ( $this->verifier["messages"] + $args[1]["messages"] ) : $this->verifier["messages"];
  }
  if(is_array($obj->addrules) && !empty($obj->addrules) ){foreach($obj->addrules as $addrule => $addveri)$this->addrules($addrule, $addveri);}
  if(empty($this->verifier["rules"]))spError("无对应的验证规则!");
  return is_array($args[0]) ? $this->checkrules($args[0],$morerow) : TRUE; // TRUE为不通过验证
}


/**
  * 按规则验证数据
  *
  * @param values    验证值
  * @param morerow 添加只验证规测里面的一项
  */
private function checkrules($values,$morerow=false){
  $this->checkvalues = $values;
  foreach( $this->verifier["rules"] as $rkey => $rval ){
   if($morerow && !isset($values[$rkey]))continue; //添加只验证规测里面的一项
   $inputval = isset($values[$rkey]) ? $values[$rkey] : '';
   foreach( $rval as $rule => $rightval ){
    if(method_exists($this, $rule)){
     if(TRUE == $this->$rule($inputval, $rightval))continue;
    }elseif(null != $this->add_rules && isset($this->add_rules[$rule])){
     if( function_exists($this->add_rules[$rule]) ){
      if(TRUE == $this->add_rules[$rule]($inputval, $rightval, $values))continue;
     }elseif( is_array($this->add_rules[$rule]) ){
      if(TRUE == spClass($this->add_rules[$rule][0])->{$this->add_rules[$rule][1]}($inputval, $rightval, $values))continue;
     }
    }else{
     spError("未知规则!");
    }
    $this->messages[$rkey][] = (isset($this->verifier["messages"][$rkey][$rule])) ? $this->verifier["messages"][$rkey][$rule] : "{$rule}";
   }
  }
  // 返回FALSE则通过验证,返回数组则未能通过验证,返回的是提示信息。
  return (null == $this->messages) ? FALSE : $this->messages;



修改完就可以,仍然可以使用原有参数调用,不影响!
请JACK老大看看,可不可行,谢过!

2010-08-28 05:41:38

#2 jake

先感谢楼主的热心,看得出来楼主很有想法。而且提出不修改原有参数这点也是很好的建议。

为什么验证规则不能重复使用呢?,限制就在notnull(非空)上面,比如说注册规则非空有至少4个,登录非空只有2个,那么注册的规则就不能用在登录的地方。

所以,楼主这里的代码,其实也是围绕在email规则的notnull上面,也就是说,如果email的notnull存在,那么仅验证id是不行的。加个参数的方法可行,不过这里还有更简单的方式,比如说$linker['rules']['email']['notnull'] = false; 然后再验证就行。

正如刚才说的,注册规则非空有4个,如果想用在登录上面,那么就可以通过数组操作,把多出来的两个非空赋值成false,那么就可以验证登录了。

重复使用验证规则,还是建议一个表单对应一个规则,无论是复制粘贴或者是数组凑拼。但是如何能更简便的修整规则,这点我还没想得很清楚,楼主也可以往这个方向来试试。

2010-08-28 09:52:48

#3 elick

遇到同样的问题  正在思考怎么弄能简单点

2011-01-08 09:50:43

#4 jake

遇到同样的问题  正在思考怎么弄能简单点
elick 发表于 2011-1-8 09:50
$verifier就是一个PHP数组,没必要想得那么复杂。
http://speedphp.com/post/database-verifier-addrules.html

http://speedphp.com/post/database-verifier-switch.html

2011-01-08 10:38:35

#5 elick

喔  原来如北 呵呵 jake是个勤劳的人 赞一个!!!

2011-01-08 15:19:51

#6 xuechu

非常同意JACK的看法,希望能和JACK一样的思路,来发展这个框架!
好久没来,很是怀念

2011-04-20 00:33:11