классы php ... проверка - PullRequest
6 голосов
/ 15 июля 2010

я делаю класс проверки php с подклассами, которые расширяют его, например, mobile, suburb, credit_card, ect

, поэтому идея в том, что вы можете позвонить

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

в качестве очень простого примера

, но есть ли лучший способ сделать это?

Ответы [ 3 ]

9 голосов
/ 15 июля 2010

Вы можете сделать это таким образом, но это можно улучшить. Наличие фактической валидатора в капсуле имеет свою собственную логику валидации. Расширение их из базового класса не. Давайте реализуем интерфейс вместо. Таким образом, любой класс может быть валидатором.

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. В отличие от вашего примера, нижеприведенный валидатор принимает несколько валидаторов, которые позволят вам создать цепочку фильтров.

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

Выше приведен шаблон команды . А благодаря тому, что Validator реализует IValidate, он также является Composite . Вы можете взять цепочку валидатора сверху и поместить ее в другую цепочку валидатора, например,

$numericGreaterThanFive = new Validator;
$numericGreaterThanFive->addValidator(new IsNumeric)
                       ->addValidator(new GreaterThan(5));

$otherValidator = new Validator;
$otherValidator->addValidator(new Foo)
               ->addValidator(new Bar)
               ->addValidator($numericGreatherThanFive);

Для удобства вы можете добавить статический метод фабрики для создания валидаторов с фактическими объектами команды валидации (как показано в другом месте).

В примечании: Zend Framework уже имеет большое количество валидаторов, на которых вы можете построить . Поскольку ZF является библиотекой компонентов, вы можете использовать их без необходимости переноса всего приложения в ZF.

2 голосов
/ 15 июля 2010

Обычно вы делаете такие вещи, используя шаблон Factory, что-то вроде этого:

class ValidatorFactory {
    public static function get($type) {
        $validator = "Validator_$type";
        return new $validator();
    }
}

$valid = ValidatorFactory::get('mobile')->validate($number);

Конечно, потребуется некоторая проверка ошибок и тому подобное, но вы должны понять,

0 голосов
/ 15 июля 2010
...
public function type($type) {
    return new self($type);
}
...

Примечание. Это каждый раз возвращает новый экземпляр вашего класса Validator, поэтому было бы лучше использовать шаблон Factory, как предложил Деннис, или не привязывать новый Validator к методу type ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...