用多个验证器验证一个值的最佳(高效、合乎逻辑)方式是什么


What is the best (efficient, logical) way to validate a value with multiple validators?

这可能是一个很有趣的问题,但我不是一个专业的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)?

您可以尝试以下操作: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或在无效上返回NULL

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

想象一下有人试图理解代码。他将研究验证方法,如果是这样。。。

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

他也许不需要阅读私人方法,一切都很清楚。