所以,想法是你可以打电话
$validation = new Validation('mobile');
$valid = $validation->validate($number);
$validation->type('suburb');
$valid2 = $validation->validate($suburb);
现在我的想法是
class Validation() {
private $v_type = null;
function __construct($type) {
$this->type($type);
}
public function type($type) {
$this->v_type = new $type();
}
public function validate($info) {
return $this->v_type->validate($info);
}
}
作为一个非常基本的例子
但有更好的方法吗?
答案 0 :(得分:9)
你可以这样做,但可以改进。拥有实际的验证器胶囊他们自己的验证逻辑是好的。从基类扩展它们不是。让我们实现一个接口。这样,任何类都可以是Validator。
interface IValidate
{
public function validate($value);
}
您的验证器将如下所示:
class IsNumeric implements IValidate
{
public function validate($value)
{
return is_numeric($value);
}
}
和
class GreaterThan implements IValidate
{
protected $_value;
public function __construct($value)
{
$this->_value = $value;
}
public function validate($value)
{
return $value > $this->_value;
}
}
你还有一个主要的Validator类。与您的示例不同,下面的Validator接受多个Validator,这将允许您创建过滤器链。
class Validator implements IValidate
{
protected $_validators;
public function addValidator(IValidate $validator)
{
$this->_validators[] = $validator;
return $this;
}
public function validate($value)
{
foreach($this->_validators as $validator) {
if ($validator->validate($value) === FALSE) {
return FALSE;
}
}
return TRUE;
}
}
这可以像:
一样使用$validator = new Validator;
$validator->addValidator(new IsNumeric)
->addValidator(new GreaterThan(5));
var_dump( $validator->validate('ten') ); // FALSE
var_dump( $validator->validate('10') ); // TRUE
var_dump( $validator->validate('1') ); // FALSE
以上几乎是Command pattern。由于Validator也实现了IValidate,它也是Composite。您可以从上面获取Validator链并将其堆叠到另一个Validator Chain中,例如
$numericGreaterThanFive = new Validator;
$numericGreaterThanFive->addValidator(new IsNumeric)
->addValidator(new GreaterThan(5));
$otherValidator = new Validator;
$otherValidator->addValidator(new Foo)
->addValidator(new Bar)
->addValidator($numericGreatherThanFive);
为方便起见,您可以使用实际的Validation Command对象添加静态工厂方法来创建Validators(如其他地方所示)。
旁注:the Zend Framework already has an extensive number of Validators you can build on。由于ZF是一个组件库,因此您无需将整个应用程序迁移到ZF即可使用它们。
答案 1 :(得分:2)
通常你使用Factory模式做这些事情,如下所示:
class ValidatorFactory {
public static function get($type) {
$validator = "Validator_$type";
return new $validator();
}
}
$valid = ValidatorFactory::get('mobile')->validate($number);
当然需要一些错误检查等等,但你应该明白这个想法
答案 2 :(得分:0)
...
public function type($type) {
return new self($type);
}
...
注意:每次都返回一个Validator类的新实例,因此最好使用Factory模式,如Dennis建议的那样,或者不将新的Validator绑定到type()方法。