Programmer's Reference Guide

Classes de validation standard

Chaînes de validation

Souvent, de multiples validations doivent être appliquées à une valeur dans un ordre particulier. Le code suivant décrit une méthode permettant de solutionner l'exemple de l'introduction, dans lequel un identifiant doit contenir précisément entre 6 et 12 caractères alphanumériques.

// Creation d'une chaine de validateurs et ajout de validateurs
$validateurChaine = new Zend_Validate();
$validateurChaine->addValidator(
                    new Zend_Validate_StringLength(array('min' => 6,
                                                         'max' => 12)))
                 ->addValidator(new Zend_Validate_Alnum());

// Validation de l'identifiant
if ($validateurChaine->isValid($identifiant)) {
    // l'identifiant est testé avec succès
} else {
    // l'identifiant échoue aux tests, afficher pourquoi
    foreach ($validateurChaine->getMessages() as $message) {
        echo "$message\n";
    }
}
Les validateurs sont exécutés dans leur ordre d'ajout à Zend_Validate. Dans l'exemple ci-dessus, l'identifiant est d'abord testé pour vérifier que sa longueur est bien comprise entre 6 et 12 caractères, puis ensuite testé pour vérifier qu'il ne contient bien que des caractères alphanumériques. Le second test est exécuté quelque soit le résultat du précédent. Ainsi, dans le cas où les deux tests échouent, getMessages() retournera un message d'échec pour chacun des validateurs.

Dans certains cas, il peut être utile d'interrompre le processus si l'un des tests échoue. Zend_Validate permet ce cas de figure via l'usage du deuxième paramètre de la méthode addValidator(). En positionnant $breakChainOnFailure à TRUE, le validateur ajouté interrompra la procédure de test s'il échoue, ce qui permet d'éviter de lancer tout autre test qui serait inutile ou inapproprié dans ce cas de figure. Si l'exemple précédent était écrit comme suit, la validation alphanumérique ne serait pas lancé si la vérification de la longueur de la valeur échouait :

  1. $validateurChaine->addValidator(
  2.                     new Zend_Validate_StringLength(array('min' => 6,
  3.                                                          'max' => 12)),
  4.                     true)
  5.                  ->addValidator(new Zend_Validate_Alnum());

Tout objet qui implémente Zend_Validate_Interface peut être utilisé dans une chaîne de validation.


Classes de validation standard

Comments

It seems to me that no precaution is taken to ensure that there are no conflicting error messages (ie. errors that have the same key) between validators. Subsequent validators may overwrite error messages if their key matches an error that is already caught by a previous validator in the chain. The isValid method simply merges the errors from each validator that fails. I guess one needs to be vigilant when chaining validators.
 
$valLoginNotExists = new *_Validate_LoginNotExists();
 $login = $this->createElement('text', 'username', array('class' => 'input'))
                         ->setLabel($this->getView()->translate('Gebruikersnaam'))
                         ->setAllowEmpty(false)
                         ->setValidators(array(
                                 'exists' => array( 
                                     $valLoginNotExists,
                                     'breakChainOnFailure' => true
                                 ),
                                 'wrong' => array(
                                     $valLogin,
                                     'breakChainOnFailure' => true
                                 )    
                             )
                         )

 ->setDecorators(array(array('ViewScript', array('viewScript' => '/form/userForm/_input.phtml'))));
$valLoginNotExists ->setMessage($this->getView()->translate("Login naam niet geldig (min. 6 tekens)"));

Some code to have multiple validators with breaks to use only one validation custom message.

+ Add A Comment

Please do not report issues via comments; use the ZF Issue Tracker.

If you have a JIRA/Crowd account, we suggest you login first before commenting.

  • BBCode is allowed in the comment markup

  • Select a Version

    Languages Available

    Components

    Search the Manual