Содержание


Введение


Валидатор, проверка данных, Introduction, ЗФ2, Zend Framework 2, ZF2, ру, ru




Компонент Zend\Validator предоставляет набор наиболее часто востребованных валидаторов. Он также предоставляет простой механизм формирования цепочки валидаторов, с помощью которого несколько валидаторов могут быть применены к единственным данным в определенном пользователем порядке.

 


Что такое валидатор?

 

Валидатор проверяет входные данные в отношении некоторых требований и выдает результат логического типа - успешно ли проверены входные данные на соответствие требованиям. Если входные данные не соответствуют требованиям, валидатор может дополнительно предоставить информацию о том, какому требованию (или требованиям) не отвечают входные данные.

 

Например, для веб-приложений может потребоваться, чтобы имя пользователя было от шести до двенадцати символов в длину и содержало только буквенно-цифровые символы. Валидатор может быть использован для обеспечения того, чтобы имя пользователя отвечало этим требованиям. Если имя пользователя не отвечает одному или обоим требованиям, было бы полезно знать, какому из требований не соответствует имя пользователя.

 

Основы использования валидаторов

 

Имеющееся, таким образом, определение валидатора, обеспечивает основу для Zend\Validator\ValidatorInterface, который определяет два метода, isValid() и getMessages(). Метод isValid() выполняет проверку указанного значения, возвращая TRUE только в том случае, если значение прошло проверку в соответствии с заданными критериями.

 

Если isValid() вернул FALSE, getMessages() вернет массив сообщений, объясняя причину (причины) сбоя проверки. Ключи массива являются короткими строками, идентифицирующими причины сбоя проверки, а значения массива являются соответствующими человекопонятными строками сообщений. Ключи и значения зависят от класса, каждый класс валидации определяет собственный набор сообщений о сбое проверки и уникальные ключи для их идентификации. Также каждый класс имеет определение констант, которые соответствуют каждому идентификатору причины сбоя проверки.

 

Примечание

 

Метод getMessages() возвращает информацию о сбое проверки только для самого последнего вызова isValid(). Каждый вызов isValid() удаляет все сообщения и ошибки, обусловленные предыдущим вызовом isValid(), потому, что вполне вероятно, что каждый вызов isValid() производится для различных входных значений.

 

Следующий пример демонстрирует проверку адреса электронной почты:

$validator = new Zend\Validator\EmailAddress();
 
if ($validator->isValid($email)) {
    // адрес электронной почты оказывается валидным
} else {
    // адрес электронной почты неправильный; печатаем причины
    foreach ($validator->getMessages() as $messageId => $message) {
        echo "Validation failure '$messageId': $messagen";
    }
}
 


Настройка сообщений

 

Классы валидации предоставляют метод setMessage(), с помощью которого можно указать формат сообщения, возвращаемого getMessages() в случае сбоя проверки. Первым аргументом этого метода является строка, содержащая сообщение об ошибке. Вы можете включить лексемы в эту строку, которые будут замещены данными, соответствующими валидатору. Лексема %value% поддерживается всеми валидаторами, она заменяется на значение, переданное методу isValid(). Другие лексемы могут быть поддержаны в каждом конкретном случае для каждого класса валидации. Например, лексема %max% поддерживается в Zend\Validator\LessThan. Метод getMessageVariables() возвращает массив различных лексем, поддерживаемых валидатором.

 

Второй необязательный аргумент является строкой, определяющей шаблон сообщения о сбое валидации, и которую необходимо установить, что полезно, если в классе валидации задано более одной причины сбоя. Если вы опустите второй аргумент, setMessage() предположит, что указанное сообщение должно быть использовано для первого шаблона сообщений, объявленного в классе валидации. У многих классов валидации определен только один шаблон сообщений, поэтому нет нужды указывать, какой шаблон сообщения вы меняете.

$validator = new Zend\Validator\StringLength(8);
$validator->setMessage(
    'The string \'%value%\' is too short; it must be at least %min% ' .
    'characters',
    Zend\Validator\StringLength::TOO_SHORT);
if (!$validator->isValid('word')) {
    $messages = $validator->getMessages();
    echo current($messages);
    // "The string 'word' is too short; it must be at least 8 characters"
}
 

С помощью метода setMessages() можно установить несколько сообщений. Его аргументом является массив, содержащий пары ключ / сообщение.

$validator = new Zend\Validator\StringLength(array('min' => 8, 'max' => 12));
$validator->setMessages( array(
    Zend\Validator\StringLength::TOO_SHORT =>
        'The string \'%value%\' is too short',
    Zend\Validator\StringLength::TOO_LONG  =>
        'The string \'%value%\' is too long'
));
 

Если ваше приложение требует еще большей гибкости при отчете о сбоях валидации, вы можете получить доступ к свойствам с тем же именем, что и лексема сообщений, поддерживаемая заданным классом валидации. Значение свойства всегда доступно в валидаторе, это значение вы указали в качестве аргумента для isValid(). Доугие свойства могут поддерживаться в каждом конкретном случае для каждого класса валидации.

$validator = new Zend\Validator\StringLength(array('min' => 8, 'max' => 12));
if (!$validator->isValid('word')) {
    echo 'Word failed: '
        . $validator->value
        . '; its length is not between '
        . $validator->min
        . ' and '
        . $validator->max
        . "n";
}
 

Перевод сообщений

 

Классы валидатора предоставляют метод setTranslator(), с помощью которого вы можете указать экземпляр Zend\I18n\Translator\Translator, который будет переводить сообщения в случае сбоя валидации. Метод getTranslator() возвращает экземпляр транслятора.

$validator = new Zend\Validator\StringLength(array('min' => 8, 'max' => 12));
$translate = new Zend\I18n\Translator\Translator();
// настройте переводчик...
$validator->setTranslator($translate);
 

С помощью статического метода setDefaultTranslator() вы можете установить экземпляр Zend\I18n\Translator\Translator, который будет использован всеми классами валидации, и который может быть получен методом getDefaultTranslator(). Это избавит вас от ручной установки переводчика для всех классов валидации и упростит ваш код.

$translate = new Zend\I18n\Translator\Translator();
// настройте переводчик...
Zend\Validator\AbstractValidator::setDefaultTranslator($translate);
 

Иногда бывает необходимо отключить переводчик в валидаторе. Чтобы отправить это в архив, вы можете использовать метод setDisableTranslator(), который принимает параметр логического типа, и isTranslatorDisabled(), чтобы получить это значение.

$validator = new Zend\Validator\StringLength(array('min' => 8, 'max' => 12));
if (!$validator->isTranslatorDisabled()) {
    $validator->setDisableTranslator();
}
 

Также можно использовать переводчик вместо установки собственных сообщений с помощью setMessage(). Но делая так, вы должны иметь в виду, что переводчик работает также с вашими собственными установленными сообщениями.