使用多个验证器验证值的最佳(有效、合乎逻辑)方法是什么?
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)
;
}
...他可能不需要读私有方法,一切都清楚了。
这可能是个菜鸟问题,但我不是专家 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)
;
}
...他可能不需要读私有方法,一切都清楚了。