使用多个验证器验证值的最佳(有效、合乎逻辑)方法是什么?

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);

然后 return 函数中的 $input 或 NULL 无效

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

想想有人试图理解代码。他打算看看 validate 方法,如果是这样的话...

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

...他可能不需要读私有方法,一切都清楚了。