Rozdział 33. Zend_Validate

Spis treści

33.1. Wprowadzenie
33.1.1. Czym jest walidator?
33.1.2. Podstawowe użycie walidatorów
33.1.3. Własne komunikaty
33.1.4. Użycie statycznej metody is()
33.2. Łańcuchy walidatorów
33.3. Pisanie walidatorów
33.4. Walidacja adresów email
33.5. Walidacja adresów serwerów

33.1. Wprowadzenie

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

33.1.1. Czym jest walidator?

Walidator 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ń, walidator 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. Walidator 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.

33.1.2. Podstawowe użycie walidatorów

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

Jeśli metoda isValid() zwróci false, za pomocą metody getMessages() można pobrać tablicę wiadomości wyjaśniających powody niepowodzenia walidacji.

The getErrors() method returns an array of shorter strings that identify the reason(s) for validation failure. These strings are meant to identify the errors. These strings are intended to be checked by your application code, not output to users. The error strings are class-dependent; each validate class defines its own set of error strings to identify the cause of the error. Each class also provides const definitions to match these error identifiers.

[Notatka] Notatka

The getMessages() and getErrors() methods return validation failure information only for the most recent isValid() call. Each call to isValid() clears any messages and errors caused by a previous isValid() call, because it's likely that each call to isValid() is made for a different input value.

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

<?php
require_once 'Zend/Validate/EmailAddress.php';

$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 $message) {
        echo "$message\n";
    }
}

33.1.3. Własne komunikaty

Validate classes provide a setMessage() method with which you can specify the format of a message returned by getMessages() in case of validation failure. The first argument of this method is a string containing the error message. You can include tokens in this string which will be substituted with data relevant to the validator. The token %value% is supported by all validators; this is substituted with the value you passed to isValid(). Other tokens may be supported on a case-by-case basis in each validate class. For example, %max% is a token supported by Zend_Validate_LessThan.

The second optional argument is a string that corresponds to the error identifiers returned by the getErrors() method. If you omit the second argument, setMessage() assumes the message you specify should be used for the first message declared in the validate class. Many validate classes only have one error message, so there is no need to specify distinctly which message you are specifying.

<?php
require_once 'Zend/Validate/StringLength.php';

$validator = new Zend_Validate_StringLength(8);

$validator->setMessage(
    'The string \'%value%\' is too short; it must be at least %min% characters',
    Zend_Validate_StringLength::TOO_SHORT);

if (!$validator->isValid('word')) {
    $m = $validator->getMessages();
    echo $m[0];

    // echoes "The string 'word' is too short; it must be at least 8 characters"
}

You can set multiple messages using the setMessages() method. Its argument is an array containing key/message pairs.

<?php
require_once 'Zend/Validate/StringLength.php';

$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'
));

If your application requires even greater flexibility with which it reports errors, you can access properties by the same name as the message tokens supported by a given validate class. The value property is always available in a validator; it is the value you specified as the argument of isValid(). Other properties may be supported on a case-by-case basis in each validate class.

<?php
require_once 'Zend/Validate/StringLength.php';

$validator = new Zend_Validate_StringLength(8, 12);

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

33.1.4. Użycie statycznej metody is()

If it's inconvenient to load a given validate class and create an instance of the validator, you can use the static method Zend_Validate::is() as an alternative invocation style. The first argument of this method is a data input value, that you would pass to the isValid() method. The second argument is a string, which corresponds to the basename of the validate class, relative to the Zend_Validate namespace. The is() method automatically loads the class, creates an instance, and applies the isValid() method to the data input.

<?php
require_once 'Zend/Validate.php';

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

<?php
require_once 'Zend/Validate.php';

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

The is() returns a boolean value, the same as the isValid() method. When using the static is() method, errors and messages are not available.

The static usage can be convenient for invoking a validator ad hoc, but if you have the need to run a validator for multiple inputs, it's more efficient to use the non-static usage, creating an instance of the validator object and calling its isValid() method.

Also, the Zend_Filter_Input class allows you to instantiate and run multiple filter and validator classes on demand to process sets of input data. See ???.