Ben başka bir sınıf geliştirmek gerektiğini düşünüyorum: Bir ValidatorChain, onaylayıcıların keyfi bir miktar alır, ve o test etmiş tüm onaylayıcıların errormessages agrega
Başvuru için docs on Zend Framework's Validator Chain bakın
EDIT
Ben sorunuzu yeniden değerlendirmek Şimdi (Bryan M yorumuna teşekkürler); neden her Validator diğer Doğrulayıcıları'nın 'hata iletileri erişmesini istiyorsun? Ben her Doğrulayıcıları'nın 'hata mesajları toplama hiyerarşisinde daha yüksek bir nesnenin sorumluluğu olduğunu söyleyebilirim.
Ancak, bireysel Doğrulayıcıları bağlamına göre hareket edebilmek istiyorsanız, diğer Doğrulayıcıları'nın sonuçları ne dayalı diğer bir deyişle,, o zaman isCorrect
için $ context parametresini ekleyebilirsiniz varsayalım yöntemi. Bu, örneğin bir Doğrulayıcıları'nın keyfi miktarda veya benzer bir şey kabul edemedi.
Gibi bir şey:
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;
}
}
Kullanımı:
$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() );
}
Ben çizdiğim, çok daha fazla düşünme (ve ben gerçekten çok demek) ihtiyacı vardır, cehennem ve kesinlikle kurşun geçirmez olarak değil adamcağız. Ama ben bu ile gidiyorum nerede anladınız umarım.
Ayrıca, yine valide edilmesi gereken sizin doğrulayıcısındaki değerleri nereye ekleyebilirim?