Я делаю класс проверки php с дополнительными классами, которые его расширяют, например, мобильный, пригород, 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); } }
как очень простой пример
но есть ли лучший способ сделать это?
Вы можете сделать это таким образом, но это может быть улучшено. Имея фактическую капсулу валидаторов, их собственная логика проверки хороша. Расширение их из базового класса – нет. Давайте вместо этого реализуем интерфейс. Таким образом, любой класс может быть 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 ниже принимает несколько Validators, что позволит вам создать цепочку фильтров.
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 реализует Ивалидат, он также является составным . Вы можете взять цепочку Validator сверху и уложить ее в другую цепочку Validator, например
$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 уже имеет большое количество Validators, на которых вы можете строить . Поскольку ZF является библиотекой компонентов, вы можете использовать их, не перенося все приложение в ZF.
Обычно вы делаете такие вещи, используя шаблон Factory, что-то вроде этого:
class ValidatorFactory { public static function get($type) { $validator = "Validator_$type"; return new $validator(); } } $valid = ValidatorFactory::get('mobile')->validate($number);
Конечно, потребуется некоторая проверка ошибок и тому подобное, но вы должны получить идею
... public function type($type) { return new self($type); } ...
Примечание. Каждый раз каждый возвращает новый экземпляр вашего класса Validator, поэтому было бы лучше использовать шаблон Factory, поскольку Деннис предложил или не связать новый Validator с типом ().