Zend_Validate-WritingValidators.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 11089 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.validate.writing_validators">
  5. <title>Écrire des validateurs</title>
  6. <para><classname>Zend_Validate</classname> fournit un ensemble de validateurs habituellement nécessaires, mais inévitablement,
  7. les développeurs souhaiteront écrire des validateurs sur mesure pour leurs besoins particuliers. La méthode
  8. d'écriture d'un validateur personnalisé est décrit dans cette section.</para>
  9. <para><classname>Zend_Validate_Interface</classname> définit trois méthodes, <code>isValid()</code>,
  10. <code>getMessages()</code>, et <code>getErrors()</code>, qui peuvent être implémentées par des classes d'utilisateur
  11. afin de créer les objets de validation sur mesure. Un objet qui implémente l'interface
  12. <classname>Zend_Validate_Interface</classname> peut être ajouté à une chaîne de validateur avec
  13. <classname>Zend_Validate::addValidator()</classname>. De tels objets peuvent également être employés avec <link
  14. linkend="zend.filter.input"><classname>Zend_Filter_Input</classname></link>.</para>
  15. <para>Comme vous avez déjà pu déduire de la description ci-dessus de <classname>Zend_Validate_Interface</classname>, les
  16. classes de validation fournie avec Zend Framework retourne une valeur booléenne pour savoir si une valeur est
  17. validée ou non. Elles fournissent également des informations sur la raison pour laquelle la validation a échoué sur
  18. une valeur. La mise à disposition de ces raisons d'échec de validation peut être utilisée par une application dans
  19. différents buts, tels que fournir des statistiques pour l'analyse de la facilité d'utilisation.</para>
  20. <para>La fonctionnalité de base de message d'échec de validation est implémentée dans
  21. <classname>Zend_Validate_Abstract</classname>. Pour inclure cette fonctionnalité en créant une classe de validation, étendez
  22. simplement <classname>Zend_Validate_Abstract</classname>. Dans la classe étendue vous implémenteriez la logique de la méthode
  23. <code>isValid()</code> et définiriez les variables de message et les modèles de message qui correspondent aux types
  24. d'échecs de validation qui peuvent se produire. Si une valeur ne passe pas vos essais de validation, alors
  25. <code>isValid()</code> devrait renvoyer <code>false</code>. Si la valeur passe vos essais de validation, alors
  26. <code>isValid()</code> devrait renvoyer <code>true</code>.</para>
  27. <para>En général, la méthode <code>isValid()</code> ne devrait lever aucune exception, excepté où il est impossible
  28. de déterminer si la valeur d'entrée est valide. Quelques exemples de cas raisonnables pour lever une exception
  29. pourraient être si un fichier ne peut pas être ouvert, un serveur de LDAP ne pourraient pas être contacté, ou une
  30. connexion de base de données est indisponible, où quand une telle chose peut être exigée pour que le succès ou
  31. l'échec de validation soit déterminé.</para>
  32. <example id="zend.validate.writing_validators.example.simple">
  33. <title>Création d'une simple classe de validation</title>
  34. <para>L'exemple suivant démontre comment un validateur personnalisé très simple pourrait être écrit. Dans ce
  35. cas-ci les règles de validation sont simplement que la valeur d'entrée doit être une valeur en virgule
  36. flottante. <programlisting role="php"><![CDATA[
  37. class MonValidateur_Float extends Zend_Validate_Abstract
  38. {
  39. const FLOAT = 'float';
  40. protected $_messageTemplates = array(
  41. self::FLOAT => "'%value%' n'est pas une valeur en virgule flottante"
  42. );
  43. public function isValid($value)
  44. {
  45. $this->_setValue($value);
  46. if (!is_float($value)) {
  47. $this->_error();
  48. return false;
  49. }
  50. return true;
  51. }
  52. }
  53. ]]></programlisting> La classe définit un modèle pour son message unique d'échec de validation, qui inclut le paramètre
  54. magique intégré, <code>%value%</code>. L'appel à <code>_setValue()</code> prépare l'objet pour insérer
  55. automatiquement la valeur examinée dans le message d'échec, si la validation de la valeur échoue. L'appel à
  56. <code>_error()</code> trace la raison d'échec de validation. Puisque cette classe définit seulement un message
  57. d'échec, il n'est pas nécessaire de fournir à <code>_error()</code> le nom du modèle de message d'échec.</para>
  58. </example>
  59. <example id="zend.validate.writing_validators.example.conditions.dependent">
  60. <title>Écriture d'une classe de validation ayant des conditions de dépendances</title>
  61. <para>L'exemple suivant démontre un ensemble plus complexe de règles de validation, où on l'exige que la valeur
  62. d'entrée doit être numérique et dans la plage des valeurs limites minimum et maximum. Une valeur d'entrée ferait
  63. échouer la validation pour exactement une des raisons suivantes : <itemizedlist>
  64. <listitem>
  65. <para>La valeur d'entrée n'est pas numérique.</para>
  66. </listitem>
  67. <listitem>
  68. <para>La valeur d'entrée est inférieure que la valeur permise minimum.</para>
  69. </listitem>
  70. <listitem>
  71. <para>La valeur d'entrée est supérieure que la valeur permise maximum.</para>
  72. </listitem>
  73. </itemizedlist></para>
  74. <para>Ces raisons d'échec de validation sont alors traduites dans les définitions de la classe : <programlisting
  75. role="php"><![CDATA[
  76. class MonValidateur_NumericBetween extends Zend_Validate_Abstract
  77. {
  78. const MSG_NUMERIC = 'msgNumeric';
  79. const MSG_MINIMUM = 'msgMinimum';
  80. const MSG_MAXIMUM = 'msgMaximum';
  81. public $minimum = 0;
  82. public $maximum = 100;
  83. protected $_messageVariables = array(
  84. 'min' => 'minimum',
  85. 'max' => 'maximum'
  86. );
  87. protected $_messageTemplates = array(
  88. self::MSG_NUMERIC => "'%value%' n'est pas numérique",
  89. self::MSG_MINIMUM => "'%value%' doit être supérieure à '%min%'",
  90. self::MSG_MAXIMUM => "'%value%' doit être inférieure à '%max%'"
  91. );
  92. public function isValid($value)
  93. {
  94. $this->_setValue($value);
  95. if (!is_numeric($value)) {
  96. $this->_error(self::MSG_NUMERIC);
  97. return false;
  98. }
  99. if ($value < $this->minimum) {
  100. $this->_error(self::MSG_MINIMUM);
  101. return false;
  102. }
  103. if ($value > $this->maximum) {
  104. $this->_error(self::MSG_MAXIMUM);
  105. return false;
  106. }
  107. return true;
  108. }
  109. }
  110. ]]></programlisting> Les propriétés publiques <code>$minimum</code> et <code>$maximum</code> ont été établies pour
  111. fournir les frontières minimum et maximum d'une valeur pour qu'elle soit validée avec succès. La classe définit
  112. également deux variables de message qui correspondent aux propriétés publiques et permettent que
  113. <code>min</code> et <code>max</code> soient employés dans des modèles de message en tant que paramètres
  114. magiques, comme avec <code>value</code>.</para>
  115. <para>Noter que si n'importe quel élément de la validation vérifié dans <code>isValid()</code> échoue, un
  116. message approprié d'échec est préparé, et la méthode renvoie immédiatement <code>false</code>. Ces règles de
  117. validation sont donc séquentiellement dépendantes. C'est-à-dire, que si un essai échoue, il n'y a aucun besoin
  118. d'examiner les règles suivantes de validation. Ce besoin peut exister, cependant. L'exemple suivant illustre
  119. comment écrire une classe ayant des règles indépendantes de validation, où l'objet de validation peut renvoyer
  120. des raisons multiples pour lesquelles une tentative particulière de validation a échoué.</para>
  121. </example>
  122. <example id="zend.validate.writing_validators.example.conditions.independent">
  123. <title>Validation avec des conditions indépendantes, avec raisons multiples d'échec</title>
  124. <para>Considérons l'écriture d'une classe de validation pour le contrôle de résistance d'un mot de passe - quand
  125. un utilisateur est requis afin de choisir un mot de passe qui respecte certains critères pour aider à la
  126. sécurisation des comptes d'utilisateur. Supposons que les critères de sécurité de mot de passe imposent que le
  127. mot de passe : <itemizedlist>
  128. <listitem>
  129. <para>est au moins une longueur de 8 caractères,</para>
  130. </listitem>
  131. <listitem>
  132. <para>contient au moins une lettre majuscule,</para>
  133. </listitem>
  134. <listitem>
  135. <para>contient au moins une lettre minuscule,</para>
  136. </listitem>
  137. <listitem>
  138. <para>et contient au moins un caractère de chiffre.</para>
  139. </listitem>
  140. </itemizedlist></para>
  141. <para>La classe suivante implémente ces critères de validation : <programlisting role="php"><![CDATA[
  142. class MonValidateur_PasswordStrength extends Zend_Validate_Abstract
  143. {
  144. const LENGTH = 'length';
  145. const UPPER = 'upper';
  146. const LOWER = 'lower';
  147. const DIGIT = 'digit';
  148. protected $_messageTemplates = array(
  149. self::LENGTH =>
  150. "'%value%' doit avoir une longueur d'au moins 8 caractères",
  151. self::UPPER =>
  152. "'%value%' doit contenir au moins une lettre majuscule",
  153. self::LOWER =>
  154. "'%value%' doit contenir au moins une lettre minuscule",
  155. self::DIGIT =>
  156. "'%value%' doit contenir au moins un chiffre"
  157. );
  158. public function isValid($value)
  159. {
  160. $this->_setValue($value);
  161. $isValid = true;
  162. if (strlen($value) < 8) {
  163. $this->_error(self::LENGTH);
  164. $isValid = false;
  165. }
  166. if (!preg_match('/[A-Z]/', $value)) {
  167. $this->_error(self::UPPER);
  168. $isValid = false;
  169. }
  170. if (!preg_match('/[a-z]/', $value)) {
  171. $this->_error(self::LOWER);
  172. $isValid = false;
  173. }
  174. if (!preg_match('/\d/', $value)) {
  175. $this->_error(self::DIGIT);
  176. $isValid = false;
  177. }
  178. return $isValid;
  179. }
  180. }
  181. ]]></programlisting>Noter que les quatre critères d'essais dans <code>isValid()</code> ne renvoient pas immédiatement
  182. <code>false</code>. Ceci permet à la classe de validation de fournir toutes les raisons pour lesquelles le mot
  183. de passe d'entrée n'a pas réussi à remplir les conditions de validation. Si, par exemple, un utilisateur entre
  184. la chaîne "<code>#$%</code>" comme mot de passe, <code>isValid()</code> entraînera que les quatre messages
  185. d'échec de validation seront retournés lors de l'appel suivant à <code>getMessages()</code>.</para>
  186. </example>
  187. </sect1>