使用多个验证器验证值的最佳(高效,逻辑)方法是什么?

时间:2015-02-07 20:57:53

标签: php validation

它可能是一个非常的noob问题,但我不是一个专家的PHP开发人员,我想知道编写以下代码的最佳(高效,逻辑)方式是什么:

function validate_1 ( $input ) {
  if ( mycondition ) {
    return $input;
  }
}

function validate_2 ( $input ) {
  if ( myOtherCondition ) {
    return $input;
  }
}

function validate ( $input ) {
  if ( validate_1( $input ) ) {
    return validate_1( $input );

  } else if ( validate_2( $input ) ) {
    return validate_2( $input );

  } else {
    return validate_last( $input );
  }
}

validate( 'a value' );
以这种方式,我总是执行两次功能。那很好还是有更好的方法(php> = 5.2)?

2 个答案:

答案 0 :(得分:3)

你可以试试这个: http://dsheiko.com/subpage/chain-of-responsibility-pattern

或者使用类来执行此操作:

abstract class Validator {
 public function validate($args);
}
class Vali1 extends Validator {
 public function validate($args){
    #validate
    return $bool;#true or false
 }
}
class Vali2 extends Validator {
 public function validate($args){
    #validate
    return $bool;#true or false
 }
}

$validators = array(new Vali1,new Vali2);
$validated=null;
foreach($validators as $validator){
   $validated = $validator->validate($args);
}

或功能:

$validators = array(
   function($args) {  retrun $bool;},
   function($args) {  retrun $bool;},
   function($args) {  retrun $bool;}
);
 $validated=null;
foreach($validators as $validator){
  $validated = $validator($args);
}

但这只是基础知识。罗马有更多的方法。

更新

$count = count($validators);
$current = 0;
do{
 $result = $validators[$current++]($args);
}while(!$result && $current < = $count);

然后返回函数中的$ input或无效的

答案 1 :(得分:1)

在编写这些不可读的代码之前,请使用一些验证策略,例如Symfony验证组件,或者只是保持简单,并尝试将代码封装在一个public function validate($data)的类(例如OrderValidator)中,并保持此方法的清洁编写您在该公共函数中使用的小型可读私有函数。

想想有人试图理解代码。他将会看看验证方法,如果它是这样的......

public function validate($data) {
    return
        $this->isEachOrderClosed($data)
        && $this->hasAtLeastOneCustomer($data)
        && $this->isNotSent($data)
    ;
}

......他可能不需要阅读私人方法,一切都很清楚。