Wprowadzenie

Komponent Zend_Validate zapewnia zestaw najczęściej potrzebnych weryfikatorów. Zapewnia też prosty mechanizm łańcuchowego wywoływania weryfikatorów, dzięki ktoremu wiele filtrów może być dodanych do jednej danej w kolejności zdefiniowanej przez programistę.

Czym jest weryfikator?

Weryfikator bada dane wejściowe w oparciu o pewne wymagania i tworzy wynik w postaci wartości logicznej - wartość ta mówi czy dane wejściowe spełniają te wymagania. Jeśli dane wejściowe nie spełniają wymagań, weryfikator może dodatkowo przekazać informacje o tym, które z wymagań nie zostały spełnione.

Na przykład, aplikacja web może wymagać, aby długość nazwy użytkownika mieściła się pomiędzy sześcioma a dwunastoma znakami, a znaki te były jedynie z grupy znaków alfanumerycznych. Weryfikator może być użyty do sprawdzenia czy nazwa użytkownika spełnia te wymagania. Jeśli wybrana nazwa użytkownika nie spełni jednego lub obu tych wymagań, użytecznie by było wiedzieć, które z wymagań nie zostało spełnione.

Podstawowe użycie weryfikatorów

Mająć ustaloną w ten sposób definicję weryfikacji, możemy zapewnić podstawę dla interfejsu Zend_Validate_Interface, który wymaga zaimplementowania przez klasę weryfikatora dwóch metod, isValid() oraz getMessages(). Metoda isValid() przeprowadza weryfikację podanej wartości, zwracając true wtedy i tylko wtedy, gdy wartość spełnia kryteria weryfikacji.

Jeśli metoda isValid() zwróci false, za pomocą metody getMessages() można pobrać tablicę wiadomości wyjaśniających powody niepowodzenia weryfikacji. Klucze elementów tablicy są krótkimi łańcuchami znaków, które identyfikują powody nieudanej weryfikacji, a wartości elementów odpowiadają pełnym treściom komunikatów. Klucze i wartości są zależne od klasy; każda klasa weryfikatora definiuje własny zestaw komunikatów o nieudanej weryfikacji, a także klucze identyfikujące je. Każda klasa posiada także definicje stałych const, które odpowiadają identyfikatorom komunikatów o nieudanej weryfikacji.

Uwaga

Metoda getMessages() zwracaja informacje o nieudanej weryfikacji tylko dla ostatniego wywołania metody isValid(). Każde wywołanie metody isValid() czyści wszystkie komunikaty i błędy, które wystąpiły podczas poprzedniego wywołania metody isValid(), ponieważ najczęściej jest tak, że każde wywołanie metody isValid() występuje dla innej wartości danych przychodzących.

Poniższy przykład pokazuje weryfikację adresu e-mail:

$validator = new Zend_Validate_EmailAddress();

if ($validator->isValid($email)) {
    // adres email jest prawidłowy
} else {
    // adres email jest nieprawidłowy; wyświetlamy komunikat
    foreach ($validator->getMessages() as $messageId => $message) {
        echo "Weryfikacja nieudana '$messageId': $message\n";
    }
}

            

Własne komunikaty

Klasy weryfikatorów zapewniają metodę setMessage() za pomocą które możesz określić format komunikatu zwracanego przez metodę getMessages() w przypadku nieudanej weryfikacji. Pierwszy argument tej metody jest łańcuchem znaków zawierającym treść komunikatu błędu. W tym łańcuchu znaków możesz użyć identyfikatorów, które zostaną zastąpione odpowiednimi danymi pochodzącymi z weryfikatora. Identyfikator %value% jest obsługiwany przez wszystkie weryfikatory; będzie on zastąpiony wartością, która została przekazana do metody isValid(). Inne identyfikatory mogą być obsługiwane indywidualnie w każdej klasie weryfikatora. Na przykład identyfikator %max% jest obsługiwany przez klasę Zend_Validate_LessThan. Metoda getMessageVariables() zwraca tablicę identyfikatorów obsługiwanych przez weryfikator.

Drugi opcjonalny argument jest łańcuchem znaków, który identyfikuje szablon komunikatu który chcesz ustawić, co jest przydatne gdy klasa definiuje więcej niż jeden komunikatów o błędach. Jeśli pominiesz drugi argument, metoda setMessage() założy, że komunikat, który określisz powinien być użyty dla pierwszego szablonu komunikatu zadeklarowanego w klasie weryfikatora. Wiele klas weryfikatorów posiada tylko jeden szablon komunikatu błędu, więc nie ma potrzeby dokładnego określania szablonu komunikatu, który chcesz nadpisać.

$validator = new Zend_Validate_StringLength(8);

$validator->setMessage(
    'Łańcuch znaków \'%value%\' jest za krotki; ' .
    'musi składać się z przynajmniej %min% znaków',
    Zend_Validate_StringLength::TOO_SHORT);

if (!$validator->isValid('word')) {
    $messages = $validator->getMessages();
    echo current($messages);

    // "Łańcuch znaków 'word' jest za krotki;
    // musi składać się z przynajmniej 8 znaków"
}

            

Możesz ustawić wiele komunikatów na raz używając metody setMessages(). Jej argumentem jest tablica zawierająca pary klucz/komunikat.

$validator = new Zend_Validate_StringLength(8, 12);

$validator->setMessages( array(
    Zend_Validate_StringLength::TOO_SHORT =>
        'Łańcuch znaków \'%value%\' jest za krótki',
    Zend_Validate_StringLength::TOO_LONG  =>
        'Łańcuch znaków \'%value%\' jest za długi'
));

            

Jeśli twoja aplikacja wymaga większej elastyczności w związku z raportowaniem nieudanej weryfikacji, możesz uzyskać dostęp do właściwości używając tych samych nazw, co identyfikatory komunikatów używane przez daną klasę weryfikatora. Właściwość value jest zawsze dostępna w weryfikatorze; jest to wartość, która została podana jako argument metody isValid(). Inne właściwości mogą być obsługiwane indywidualnie w każdej klasie weryfikatora.

$validator = new Zend_Validate_StringLength(8, 12);

if (!validator->isValid('word')) {
    echo 'Słowo niepoprawne: '
        . $validator->value
        . '; długość nie jest pomiędzy '
        . $validator->min
        . ' i '
        . $validator->max
        . "\n";
}

            

Użycie statycznej metody is()

Jeśli niewygodne jest ładowanie danej klasy weryfikatora i tworzenie instancji weryfikatora, możesz użyć statycznej metody Zend_Validate::is() jako alternatywnego sposobu wywołania. Pierwszym argumentem tej metody są dane wejściowe, które chcesz przekazać do metody isValid(). Drugi argument jest łańcuchem znaków, który odpowiada, bazowej nazwie klasy weryfikatora, relatywnie do przestrzeni nazw Zend_Validate. Metoda is() automatycznie ładuje klasę, tworzy instancję i wywołuje metodę isValid() na danych wejściowych.

if (Zend_Validate::is($email, 'EmailAddress')) {
    // Tak, adres email jest poprawny
}

            

Możesz także przekazać tablicę argumentów konstruktora, jeśli są one potrzebne w klasie weryfikatora.

if (Zend_Validate::is($value, 'Between', array(1, 12))) {
    // Tak, wartość $value jest pomiędzy 1 i 12
}

            

Metoda is() zwraca wartość logiczną, taką samą jak metoda isValid(). Gdy używana jest metoda statyczna is(), komunikaty o nieudanej weryfikacji są niedostępne.

Użycie statyczne może być wygodne dla jednorazowego wywołania weryfikatora, ale jeśli musisz wywołać weryfikator dla większej ilości danych, bardziej efektywne jest wykorzystanie rozwiązania niestatycznego, czyli utworzenie instancji obiektu weryfikatora i wywołanie metody isValid().

Dodatkowo klasa Zend_Filter_Input pozwala na utworzenie instancji i wywołanie większej ilości klas filtrów i weryfikatorów w celu przetworzenia zestawu danych wejściowych. Zobacz „Zend_Filter_Input”.