Podría hacerlo de esta manera, pero podría mejorarse. Tener los validadores reales en cápsula con su propia lógica de validación es bueno. Extenderlos desde una clase base no lo es. Implementemos una interfaz en su lugar. De esta forma, cualquier clase puede ser un Validador.
interface IValidate
{
public function validate($value);
}
Sus validadores se vería así entonces:
class IsNumeric implements IValidate
{
public function validate($value)
{
return is_numeric($value);
}
}
y
class GreaterThan implements IValidate
{
protected $_value;
public function __construct($value)
{
$this->_value = $value;
}
public function validate($value)
{
return $value > $this->_value;
}
}
usted todavía tienen una clase principal validador. A diferencia de su ejemplo, el Validador a continuación acepta múltiples Validadores, lo que le permitirá crear una Cadena de Filtro.
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;
}
}
Y esto podría ser utilizado como:
$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
Lo anterior es más o menos un Command pattern. Y debido a que el Validator también implementa IValidate, también es un Composite. Puede tomar la cadena del Validator desde arriba y apilarla en otra Cadena del Validador, p.
$numericGreaterThanFive = new Validator;
$numericGreaterThanFive->addValidator(new IsNumeric)
->addValidator(new GreaterThan(5));
$otherValidator = new Validator;
$otherValidator->addValidator(new Foo)
->addValidator(new Bar)
->addValidator($numericGreatherThanFive);
Para mayor comodidad, se puede añadir un método de fábrica estática para crear validadores con los objetos reales Validación de comando (como se muestra en otros lugares).
En una nota al margen: the Zend Framework already has an extensive number of Validators you can build on. Dado que ZF es una biblioteca de componentes, puede usarlos sin tener que migrar toda su aplicación a ZF.