27.2. Łańcuchy walidatorów
Poprzedni | Rozdział 27. Zend_Validate | Następny

## 27.2. Łańcuchy walidatorów

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`.

Poprzedni | Początek rozdziału | Następny
Rozdział 27. Zend_Validate | Spis treści | 27.3. Pisanie walidatorów