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