Często do pewnej wartości potrzebujemy zastosować wiele walidatorów w określonej kolejności. Poniższy kod demonstruje sposób rozwiązania przykładu z wprowadzenia, gdzie nazwa użytkownika musi mieć długość między 6 a 12 alfanumerycznych znaków:
<?php // Zapewnia możliwość łańcuchowego wywoływania walidatorów require_once 'Zend/Validate.php'; // Walidatory użyte w przykładzie require_once 'Zend/Validate/StringLength.php'; require_once 'Zend/Validate/Alnum.php'; // Tworzymy łańcuch walidatorów i dodajemy do niego walidatory $validatorChain = new Zend_Validate(); $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12)) ->addValidator(new Zend_Validate_Alnum()); // Sprawdzamy nazwę użytkownika if ($validatorChain->isValid($username)) { // nazwa użytkownika jest poprawna } else { // nazwa użytkownika nie jest poprawna; wyświetlamy komunikaty foreach ($validatorChain->getMessages() as $message) { echo "$message\n"; } } ?>
Walidatory są uruchamiane w takiej kolejności, w jakiej zostały dodane
do Zend_Validate
. W powyższym przykładzie, wpierw jest
sprawdzane jest to, czy długość nazwy użytkownika mieści się miedzy 6 a
12 znaków, a następnie sprawdzane jest czy zawiera ona tylko znaki
alfanumeryczne. Druga walidacja, dla alfanumerycznych znaków, jest
przeprowadzana niezależnie od tego, czy pierwsza walidacja, dla długości
pomiędzy 6 a 12 znaków udała się. Oznacza to, że jeśli nie udadzą się
obie walidacje, to metoda getMessages()
zwróci wiadomości
błędów pochodzące od obu walidatorów.
W niektórych przypadkach sensowna może być możliwość przerwania
łańcucha walidatorów w przypadku, gdy proces walidacji nie uda się.
Zend_Validate
obsługuje takie przypadki za pomocą
ustawienia drugiego parametru w metodzie addValidator()
.
Ustawiając wartość zmiennej $breakChainOnFailure
na
true
, dodany walidator przerwie łańcuchowe wywoływanie
przy wystąpieniu błędu, co zapobiegnie uruchamianiu innych walidacji,
które w danej sytuacji zostaną uznane za bezużyteczne. Jeśli powyższy
przykład byłby napisany tak jak poniżej, wtedy walidacja znaków
alfanumerycznych nie byłaby przeprowadzona jeśli długość łańcucha znaków
byłaby nieodpowiednia:
<?php $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12), true) ->addValidator(new Zend_Validate_Alnum()); ?>
W łańcuchu walidatorów może być użyty dowolny obiekt, który implementuje
interfejs Zend_Validate_Interface
.