1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.validate.validator_chains">
5 <title>Цепочки валидаторов</title>
8 Часто к одному и тому же значению должно быть применено несколько
9 валидаций в определенном порядке. Следующий код демонстрирует способ
11 <link linkend="zend.validate.introduction">введения</link>, где имя
12 пользователя должно быть длиной от 6 до 12 символов и состоять только из
13 алфавитно-цифровых символов:
15 <programlisting language="php"><![CDATA[
16 // Создает цепочку валидаторов и добавляет валидаторы в нее
17 $validatorChain = new Zend_Validate();
18 $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12))
19 ->addValidator(new Zend_Validate_Alnum());
21 // Валидация имени пользователя
22 if ($validatorChain->isValid($username)) {
23 // имя пользователя прошло валидацию
25 // имя пользователя не прошло валидацию; вывод причин этого
26 foreach ($validatorChain->getMessages() as $message) {
32 Валидаторы применяются в том же порядке, в котором они были добавлены в
33 <classname>Zend_Validate</classname>. В примере выше сначала проверяется,
34 находится ли длина имени пользователя в пределах 6-12 символов, затем
35 проверяется, содержит ли имя пользователя только алфавитно-цифровые
36 символы. Вторая проверка проводится независимо от того, была ли успешно
37 пройдена первая проверка. Это означает, что если обе валидации
38 не были пройдены, то <code>getMessages()</code> вернет сообщения об
39 ошибках валидации от обоих валидаторов.
43 В некоторых случаях имеет смысл прерывать валидацию, если данные не
44 прошли проверку каким-либо валидатором в цепочке.
45 <classname>Zend_Validate</classname> обеспечивает эту возможность с
46 помощью второго параметра метода <code>addValidator()</code>. При
47 установке <varname>$breakChainOnFailure</varname> в <constant>TRUE</constant>,
48 добавленный валидатор будет прерывать выполнение цепочки валидаций в
49 случае неудачи. Это позволяет избежать выполнения других валидаций,
50 которые были бы излишними или неподходящими в данной ситуации.
51 Ниже приводится переписанный пример, в котором проверка на
52 алфавитно-цифровые символы не должна
53 производиться, если не была пройдена проверка на длину строки:
55 <programlisting language="php"><![CDATA[
56 $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12), true)
57 ->addValidator(new Zend_Validate_Alnum());
63 Любые объекты, реализующие
64 <classname>Zend_Validate_Interface</classname>, могут быть
65 использованы в цепочке валидаторов.