| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect1 id="zend.validate.validator_chains">
- <title>Цепочки валидаторов</title>
- <para>
- Часто к одному и тому же значению должно быть применено несколько
- валидаций в определенном порядке. Следующий код демонстрирует способ
- решения примера из
- <link linkend="zend.validate.introduction">введения</link>, где имя
- пользователя должно быть длиной от 6 до 12 символов и состоять только из
- алфавитно-цифровых символов:
- <programlisting language="php"><![CDATA[
- // Создает цепочку валидаторов и добавляет валидаторы в нее
- $validatorChain = new Zend_Validate();
- $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12))
- ->addValidator(new Zend_Validate_Alnum());
- // Валидация имени пользователя
- if ($validatorChain->isValid($username)) {
- // имя пользователя прошло валидацию
- } else {
- // имя пользователя не прошло валидацию; вывод причин этого
- foreach ($validatorChain->getMessages() as $message) {
- echo "$message\n";
- }
- }
- ]]></programlisting>
- Валидаторы применяются в том же порядке, в котором они были добавлены в
- <classname>Zend_Validate</classname>. В примере выше сначала проверяется,
- находится ли длина имени пользователя в пределах 6-12 символов, затем
- проверяется, содержит ли имя пользователя только алфавитно-цифровые
- символы. Вторая проверка проводится независимо от того, была ли успешно
- пройдена первая проверка. Это означает, что если обе валидации
- не были пройдены, то <code>getMessages()</code> вернет сообщения об
- ошибках валидации от обоих валидаторов.
- </para>
- <para>
- В некоторых случаях имеет смысл прерывать валидацию, если данные не
- прошли проверку каким-либо валидатором в цепочке.
- <classname>Zend_Validate</classname> обеспечивает эту возможность с
- помощью второго параметра метода <code>addValidator()</code>. При
- установке <varname>$breakChainOnFailure</varname> в <constant>TRUE</constant>,
- добавленный валидатор будет прерывать выполнение цепочки валидаций в
- случае неудачи. Это позволяет избежать выполнения других валидаций,
- которые были бы излишними или неподходящими в данной ситуации.
- Ниже приводится переписанный пример, в котором проверка на
- алфавитно-цифровые символы не должна
- производиться, если не была пройдена проверка на длину строки:
- <programlisting language="php"><![CDATA[
- $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12), true)
- ->addValidator(new Zend_Validate_Alnum());
- ]]></programlisting>
- </para>
- <para>
- Любые объекты, реализующие
- <classname>Zend_Validate_Interface</classname>, могут быть
- использованы в цепочке валидаторов.
- </para>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|