Zend_Validate-ValidatorChains.xml 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.validate.validator_chains">
  4. <title>Цепочки валидаторов</title>
  5. <para>
  6. Часто к одному и тому же значению должно быть применено несколько
  7. валидаций в определенном порядке. Следующий код демонстрирует способ
  8. решения примера из
  9. <link linkend="zend.validate.introduction">введения</link>, где имя
  10. пользователя должно быть длиной от 6 до 12 символов и состоять только из
  11. алфавитно-цифровых символов:
  12. <programlisting language="php"><![CDATA[
  13. // Создает цепочку валидаторов и добавляет валидаторы в нее
  14. $validatorChain = new Zend_Validate();
  15. $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12))
  16. ->addValidator(new Zend_Validate_Alnum());
  17. // Валидация имени пользователя
  18. if ($validatorChain->isValid($username)) {
  19. // имя пользователя прошло валидацию
  20. } else {
  21. // имя пользователя не прошло валидацию; вывод причин этого
  22. foreach ($validatorChain->getMessages() as $message) {
  23. echo "$message\n";
  24. }
  25. }
  26. ]]></programlisting>
  27. Валидаторы применяются в том же порядке, в котором они были добавлены в
  28. <classname>Zend_Validate</classname>. В примере выше сначала проверяется,
  29. находится ли длина имени пользователя в пределах 6-12 символов, затем
  30. проверяется, содержит ли имя пользователя только алфавитно-цифровые
  31. символы. Вторая проверка проводится независимо от того, была ли успешно
  32. пройдена первая проверка. Это означает, что если обе валидации
  33. не были пройдены, то <code>getMessages()</code> вернет сообщения об
  34. ошибках валидации от обоих валидаторов.
  35. </para>
  36. <para>
  37. В некоторых случаях имеет смысл прерывать валидацию, если данные не
  38. прошли проверку каким-либо валидатором в цепочке.
  39. <classname>Zend_Validate</classname> обеспечивает эту возможность с
  40. помощью второго параметра метода <code>addValidator()</code>. При
  41. установке <varname>$breakChainOnFailure</varname> в <constant>TRUE</constant>,
  42. добавленный валидатор будет прерывать выполнение цепочки валидаций в
  43. случае неудачи. Это позволяет избежать выполнения других валидаций,
  44. которые были бы излишними или неподходящими в данной ситуации.
  45. Ниже приводится переписанный пример, в котором проверка на
  46. алфавитно-цифровые символы не должна
  47. производиться, если не была пройдена проверка на длину строки:
  48. <programlisting language="php"><![CDATA[
  49. $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12), true)
  50. ->addValidator(new Zend_Validate_Alnum());
  51. ]]></programlisting>
  52. </para>
  53. <para>
  54. Любые объекты, реализующие
  55. <classname>Zend_Validate_Interface</classname>, могут быть
  56. использованы в цепочке валидаторов.
  57. </para>
  58. </sect1>
  59. <!--
  60. vim:se ts=4 sw=4 et:
  61. -->