php类...验证

Hai*_*ood 6 php oop validation class

我正在使用扩展它的子类制作一个php验证类,例如移动,郊区,credit_card等

所以,这个想法是你可以打电话的

$validation = new Validation('mobile');
$valid = $validation->validate($number);

$validation->type('suburb');
$valid2 = $validation->validate($suburb);
Run Code Online (Sandbox Code Playgroud)

现在我这样做的想法就是

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

作为一个非常基本的例子

但是有更好的方法吗?

Gor*_*don 9

你可以这样做,但它可以改进.拥有实际的验证器胶囊他们自己的验证逻辑是好的.从基类扩展它们不是.让我们实现一个接口.这样,任何类都可以成为Validator.

interface IValidate
{
    public function validate($value);
}
Run Code Online (Sandbox Code Playgroud)

您的验证器将如下所示:

class IsNumeric implements IValidate
{
    public function validate($value)
    {
        return is_numeric($value);
    }
}
Run Code Online (Sandbox Code Playgroud)

class GreaterThan implements IValidate
{
    protected $_value;
    public function __construct($value)
    {
        $this->_value = $value;
    }
    public function validate($value)
    {
        return $value > $this->_value;
    }
}
Run Code Online (Sandbox Code Playgroud)

你还有一个主要的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以像:

$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
Run Code Online (Sandbox Code Playgroud)

以上几乎是一个Command模式.由于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);
Run Code Online (Sandbox Code Playgroud)

为方便起见,您可以使用实际的Validation Command对象添加静态工厂方法来创建Validators(如其他地方所示).

旁注:Zend Framework已经拥有大量可以构建的验证器.由于ZF是一个组件库,因此您无需将整个应用程序迁移到ZF即可使用它们.