Я думаю, вам следует разработать другой класс: ValidatorChain, который принимает произвольное количество валидаторов и объединяет сообщения об ошибках всех валидаторов, которые он тестировал
Для справки см. документы по цепочке валидаторов Zend Framework
EDIT
Теперь, когда я переоцениваю ваш вопрос (благодаря комментарию Брайана М); Почему вы хотите, чтобы каждый отдельный Валидатор имел доступ к сообщениям об ошибках других Валидаторов? Я бы сказал, что сбор сообщений об ошибках каждого отдельного Валидатора является обязанностью объекта выше в иерархии.
Если, однако, вы хотите, чтобы отдельные валидаторы могли действовать в зависимости от контекста, другими словами, в зависимости от результатов других валидаторов, то я полагаю, вы можете добавить параметр $ context в метод isCorrect
, Это может, например, принять произвольное количество валидаторов или что-то подобное.
Что-то вроде:
interface ValidatorInterface
{
public function isCorrect( array $context );
public function getMessages();
}
abstract class ValidatorContextOptions
{
const SHOULD_BE_PRESENT = 'shouldBePresent';
const SHOULD_NOT_BE_PRESENT = 'shouldNotBePresent';
const SHOULD_BE_VALID = 'shouldBeValid';
}
class EmailValidator implements ValidatorInterface
{
protected $_field;
protected $_contextOptions = array();
protected $_messages = array();
public function __construct( $field, array $contextOptions )
{
$this->_field = $field;
$this->_contextOptions = $contextOptions;
}
public function isCorrect( array $context = null )
{
foreach( $this->_contextOptions as $field => $options )
{
foreach( $options as $option )
{
switch( $option )
{
case ValidatorContextOptions::SHOULD_NOT_BE_PRESENT:
if( isset( $context[ $field ] )
&& $context[ $field ] instanceof ValidatorInterface )
{
$this->_messages[] = $field . ' should not be present';
return false;
}
break;
case ValidatorContextOptions::SHOULD_BE_PRESENT:
if( !isset( $context[ $field ] )
|| !$context[ $field ] instanceof ValidatorInterface )
{
$this->_messages[] = $field . ' should be present';
return false;
}
break;
case ValidatorContextOptions::SHOULD_BE_VALID:
if( !isset( $context[ $field ] )
|| !$context[ $field ] instanceof ValidatorInterface
|| !$context[ $field ]->isCorrect() )
{
$this->_messages[] = $field . ' should be valid';
return false;
}
break;
}
}
}
// some dummy function which you should replace with real validation
return isAnEmailAddress( $this->_field );
}
public function getMessages()
{
return $this->_messages;
}
}
Использование:
$emailValidatorContextOptions = array
(
'phone' => array(
ValidatorContextOptions::SHOULD_BE_PRESENT,
ValidatorContextOptions::SHOULD_BE_VALID
)
);
$phoneValidator = new PhoneValidator( $phoneString );
$emailValidator = new EmailValidator( $emailString, $emailValidatorContextOptions );
if( !$emailValidator->isCorrect( array( 'phone' => $phoneValidator ) ) )
{
print_r( $emailValidator->getMessages() );
}
То, что я показал здесь, требует гораздо больше размышлений (и я действительно имею в виду много), чертовски глючит и определенно не пуленепробиваемое. Но я надеюсь, что вы поймете, что я пойду с этим.
Кроме того, куда вы вставляете значения в свой валидатор, которые все равно должны быть проверены?