Zend_Validate.xml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17133 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.validate.introduction">
  5. <title>Einführung</title>
  6. <para>
  7. Die Zend_Validate Komponente bietet ein Set von üblich verwendeten Prüfungen. Sie bietet
  8. auch einen einfachen Prüf-Ketten-Mechanismus mit welchem mehrfache Prüfungen zu einem
  9. einfachen Wert in einer benutzer-definierten Art und Weise zugeordnet werden können.
  10. </para>
  11. <sect2 id="zend.validate.introduction.definition">
  12. <title>Was ist eine Prüfung?</title>
  13. <para>
  14. Eine Prüfung untersucht seine Eingabe mit Obacht auf einige Anforderungen und produziert
  15. ein boolsches Ergebnis - wenn die Eingabe erfolgreich gegen die Anforderungen geprüft
  16. werden konnte. Wenn die Eingabe den Anforderungen nicht entspricht, kann die Prüfung
  17. zusätzliche Informationen darüber bieten, welche der Anforderungen die Eingabe nicht
  18. entspricht.
  19. </para>
  20. <para>
  21. Eine WebAnwendung, zum Beispiel, könnte erfordern das ein Benutzername zwischen sechs
  22. und zwölf Zeichen lang ist und dürfte nur alphanummerische Zeichen enthalten. Eine
  23. Prüfung kann dafür verwendet werden um sicherzustellen das Benutzernamen diesen
  24. Anforderungen entsprechen. Wenn ein gewählter Benutzername einer oder beiden
  25. Anforderungen nicht entspricht, wäre es nützlich zu wissen welche der Anforderungen der
  26. Benutzername nicht entsprochen hat.
  27. </para>
  28. </sect2>
  29. <sect2 id="zend.validate.introduction.using">
  30. <title>Standardnutzung von Prüfungen</title>
  31. <para>
  32. Prüfungen auf diesem Weg definiert zu haben, bietet die Sammlung für
  33. <classname>Zend_Validate_Interface</classname> welche zwei Methoden definiert,
  34. <methodname>isValid()</methodname> und <methodname>getMessages()</methodname>. Die
  35. <methodname>isValid()</methodname> Methode führt eine Prüfung über die angegebenen Werte
  36. aus, und gibt nur dann <constant>TRUE</constant> zurück wenn der Wert gegenüber den
  37. Kriterien der Prüfung entsprochen hat.
  38. </para>
  39. <para>
  40. Wenn <methodname>isValid()</methodname> <constant>FALSE</constant> zurück gibt, bietet
  41. <methodname>getMessages()</methodname> ein Array von Nachrichten welche die Gründe für
  42. die fehlgeschlagene Prüfung beschreiben. Die Arrayschlüssel sind kurze Strings die die
  43. Gründe für eine fehlgeschlagene Prüfung identifizieren, und die Arraywerte sind die
  44. entsprechend menschlich-lesbaren String Nachrichten. Die Schlüssel und Werte sind
  45. Klassenabhängig; jede Prüfklasse definiert Ihr eigenes Set von Nachrichten für
  46. fehlgeschlagene Prüfungen und die eindeutigen Schlüssel die diese identifizieren. Jede
  47. Klasse hat also eine <code>const</code> Definition die jedem Identifikator für eine
  48. fehlgeschlagene Prüfung entspricht.
  49. </para>
  50. <note>
  51. <para>
  52. Die <methodname>getMessages()</methodname> gibt die Information für Prüfungsfehler
  53. nur für den zuletzt durchgeführten Aufruf von <methodname>isValid()</methodname>
  54. zurück. Jeder Aufruf von <methodname>isValid()</methodname> löscht jegliche
  55. Nachricht und Fehler welche durch vorhergehende <methodname>isValid()</methodname>
  56. Aufrufe vorhanden waren, weil normalerweise jeder Aufruf von
  57. <methodname>isValid()</methodname> für einen unterschiedlichen Eingabewert gemacht
  58. wird.
  59. </para>
  60. </note>
  61. <para>
  62. Das folgende Beispiel zeigt die Prüfung einer E-Mail Adresse:
  63. <programlisting language="php"><![CDATA[
  64. $validator = new Zend_Validate_EmailAddress();
  65. if ($validator->isValid($email)) {
  66. //
  67. // E-Mail scheint gültig zu sein
  68. //
  69. } else {
  70. //
  71. // E-Mail ist ungültig; drucke die Gründe
  72. //
  73. foreach ($validator->getMessages() as $messageId => $message) {
  74. echo "Validation failure '$messageId': $message\n";
  75. }
  76. }
  77. ]]></programlisting>
  78. </para>
  79. </sect2>
  80. <sect2 id="zend.validate.introduction.messages">
  81. <title>Nachrichten anpassen</title>
  82. <para>
  83. Prüf Klassen bieten eine <methodname>setMessage()</methodname> Methode mit der das
  84. Format der Nachricht definiert werden kann die von
  85. <methodname>getMessages()</methodname> im Fall einer fehlerhaften Prüfung zurückgegeben
  86. wird. Das erste Argument dieser Methode ist ein String der die Fehlernachricht enthält.
  87. Es können Kürzel in den String eingebaut werden welche mit den für die Prüfung
  88. relevanten Daten aufgefüllt werden. Das Kürzel <code>%value%</code> wird von allen
  89. Prüfungen unterstützt; es ist verbunden mit dem Wert der an
  90. <methodname>isValid()</methodname> übergeben wird. Andere Kürzel können unterstützt
  91. werden von Fall-zu-Fall in jeder Prüfer-Klasse. Zum Beispiel ist <code>%max%</code> das
  92. Kürzel welches von <classname>Zend_Validate_LessThan</classname> unterstützt wird. Die
  93. <methodname>getMessageVariables()</methodname> Methode give ein Array von variablen
  94. Kürzel zurück welche vom Prüfer unterstützt werden.
  95. </para>
  96. <para>
  97. Das zweite optionale Argument ist ein String der das Template der fehlerhaften
  98. Prüfnachricht die gesetzt werden soll identifiziert. Das ist nützlich wenn eine
  99. Prüfklasse mehr als einen Grund für einen Fehlschlag definiert. Wenn das zweite Argument
  100. nicht angegeben wird, nimmt <methodname>setMessage()</methodname> an das die
  101. spezifizierte Nachricht für das erste Messagetemplate verwendet werden soll das in der
  102. Prüfklasse definiert ist. Viele Prüfklassen haben nur ein Template für eine
  103. Fehlernachricht definiert, sodas es nicht notwendig ist anzugeben welches Template für
  104. Fehlernachrichten geändert werden soll.
  105. </para>
  106. <para>
  107. <programlisting language="php"><![CDATA[
  108. $validator = new Zend_Validate_StringLength(8);
  109. $validator->setMessage(
  110. 'Der String \'%value%\' ist zu kurz; er muss mindestens %min% ' .
  111. 'Zeichen sein',
  112. Zend_Validate_StringLength::TOO_SHORT);
  113. if (!$validator->isValid('word')) {
  114. $messages = $validator->getMessages();
  115. echo $messages[0];
  116. // "Der String 'word' ist zu kurz; er muss mindestens 8 Zeichen sein"
  117. }
  118. ]]></programlisting>
  119. </para>
  120. <para>
  121. Es können mehrere Nachrichten gesetzt werden durch Verwendung der
  122. <methodname>setMessages()</methodname> Methode. Dessen Argument ist ein Array welches
  123. Schlüssel/Nachrichten Paare enthält.
  124. <programlisting language="php"><![CDATA[
  125. $validator = new Zend_Validate_StringLength(8, 12);
  126. $validator->setMessages( array(
  127. Zend_Validate_StringLength::TOO_SHORT =>
  128. 'Der String \'%value%\' ist zu kurz',
  129. Zend_Validate_StringLength::TOO_LONG =>
  130. 'Der String \'%value%\' ist zu lang'
  131. ));
  132. ]]></programlisting>
  133. </para>
  134. <para>
  135. Wenn die Anwendung mehr Flexibilität benötigt in der Art und Weise wie Prüffehler
  136. gemeldet werden, kann auf die Eigenschaften durch den selben Namen zugegriffen
  137. werden wie mit dem Nachrichten Kürzel das von einer Prüfklasse unterstützt wird.
  138. Die <code>value</code> Eigenschaft ist immer in einem Prüfer vorhanden; Das ist
  139. der Wert der als Argument von <methodname>isValid()</methodname> definiert wurde. Andere
  140. Eigenschaften können von Fall zu Fall in jeder Prüfklasse unterstützt werden.
  141. <programlisting language="php"><![CDATA[
  142. $validator = new Zend_Validate_StringLength(8, 12);
  143. if (!validator->isValid('word')) {
  144. echo 'Wort fehlgeschlaten: '
  145. . $validator->value
  146. . '; die Länge ist nicht zwischen '
  147. . $validator->min
  148. . ' und '
  149. . $validator->max
  150. . "\n";
  151. }
  152. ]]></programlisting>
  153. </para>
  154. </sect2>
  155. <sect2 id="zend.validate.introduction.static">
  156. <title>Verwenden der statischen is() Methode</title>
  157. <para>
  158. Wenn es nicht gebräuchlich ist eine gegebenen Prüfklasse zu laden und eine Instanz
  159. des Prüfers zu erstellen, kann die statische Methode
  160. <classname>Zend_Validate::is()</classname> verwendet werden als alternativer Stil des
  161. Aufrufs. Das erste Argument dieser Methode ist ein Datenwert, der an die
  162. <methodname>isValid()</methodname> Methode übergeben werden würde. Das zweite Argument
  163. ist ein String, welcher mit dem Basisnamen der Prüfklasse übereinstimmt, relativ zum
  164. Namensraum von <classname>Zend_Validate</classname>. Die <methodname>is()</methodname>
  165. Methode lädt die Klasse automatisch, erstellt eine Instanz und wendet die
  166. <methodname>isValid()</methodname> Methode an den Eingabedaten an.
  167. <programlisting language="php"><![CDATA[
  168. if (Zend_Validate::is($email, 'EmailAddress')) {
  169. // Ja, die Email Adresse scheint gültig zu sein
  170. }
  171. ]]></programlisting>
  172. </para>
  173. <para>
  174. Es kann auch ein Array von Konstruktor Argumenten übergeben werden, wenn diese für die
  175. Prüfung benötigt werden.
  176. <programlisting language="php"><![CDATA[
  177. if (Zend_Validate::is($value, 'Between', array(1, 12))) {
  178. // Ja, $value ist zwischen 1 und 12
  179. }
  180. ]]></programlisting>
  181. </para>
  182. <para>
  183. Die <methodname>is()</methodname> Methode gibt einen boolschen Wert zurück, denselben
  184. wie die <methodname>isValid()</methodname> Methode. Wird die statische
  185. <methodname>is()</methodname> Methode verwendet, sind Nachrichten für Prüffehler nicht
  186. vorhanden.
  187. </para>
  188. <para>
  189. Die statische Verwendung kann bequem sein für das ad hoc Verwenden eines Prüfers,
  190. aber wenn ein Prüfer für mehrere Eingaben verwendet werden soll ist es effizienter
  191. die nicht statische Verwendung zu benutzen, indem eine Instanz des Prüf Objektes
  192. erstellt wird und dessen <methodname>isValid()</methodname> Methode aufgerufen wird.
  193. </para>
  194. <para>
  195. Die <classname>Zend_Filter_Input</classname> Klasse erlaubt es auch mehrfache Filter und
  196. Prüfklassen zu instanzieren und bei Bedarf aufzurufen um Sets von Eingabedaten zu
  197. bearbeiten. Siehe <xref linkend="zend.filter.input" />.
  198. </para>
  199. <sect3 id="zend.validate.introduction.static.namespaces">
  200. <title>Namespaces</title>
  201. <para>
  202. Wenn man mit selbst definierten Prüfungen arbeitet, dann kann man an
  203. <methodname>Zend_Validate::is()</methodname> einen vierten Parameter übergeben
  204. welcher der Namespace ist, an dem die eigene Prüfung gefunden werden kann.
  205. </para>
  206. <programlisting language="php"><![CDATA[
  207. if (Zend_Validate::is($value, 'MyValidator', array(1, 12),
  208. array('FirstNamespace', 'SecondNamespace')) {
  209. // Ja, $value ist in Ordnung
  210. }
  211. ]]></programlisting>
  212. <para>
  213. <classname>Zend_Validate</classname> erlaubt es auch standardmäßige Namespaces zu
  214. setzen. Das bedeutet das man Sie einmal in der Bootstrap setzt und sie nicht mehr
  215. bei jedem Aufruf von <methodname>Zend_Validate::is()</methodname> angeben muß. Der
  216. folgende Codeschnipsel ist identisch mit dem vorherigen.
  217. </para>
  218. <programlisting language="php"><![CDATA[
  219. Zend_Validate::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
  220. if (Zend_Validate::is($value, 'MyValidator', array(1, 12)) {
  221. // Yes, $value is ok
  222. }
  223. if (Zend_Validate::is($value, 'OtherValidator', array(1, 12)) {
  224. // Yes, $value is ok
  225. }
  226. ]]></programlisting>
  227. <para>
  228. Der Bequemlichkeit halber gibt es die folgenden Methoden welche die Behandlung von
  229. Namespaces erlauben:
  230. </para>
  231. <itemizedlist>
  232. <listitem>
  233. <para>
  234. <emphasis><methodname>Zend_Validate::getDefaultNamespaces()</methodname></emphasis>:
  235. Gibt alle standardmäßigen Namespaces als Array zurück.
  236. </para>
  237. </listitem>
  238. <listitem>
  239. <para>
  240. <emphasis><methodname>Zend_Validate::setDefaultNamespaces()</methodname></emphasis>:
  241. Setzt neue standardmäßige Namespaces und überschreibt alle vorher
  242. gesetzten. Es wird entweder ein String für einen einzelnen Namespace
  243. akzeptiert, oder ein Array für mehrere Namespaces.
  244. </para>
  245. </listitem>
  246. <listitem>
  247. <para>
  248. <emphasis><methodname>Zend_Validate::addDefaultNamespaces()</methodname></emphasis>:
  249. Fügt zusätzliche Namespaces zu den bereits gesetzten hinzu. Es wird
  250. entweder ein String für einen einzelnen Namespace akzeptiert, oder ein
  251. Array für mehrere Namespaces.
  252. </para>
  253. </listitem>
  254. <listitem>
  255. <para>
  256. <emphasis><methodname>Zend_Validate::hasDefaultNamespaces()</methodname></emphasis>:
  257. Gibt true zurück wenn ein oder mehrere standardmäßige Namespaces gesetzt
  258. sind, und false wenn keine standardmäßigen Namespaces gesetzt sind.
  259. </para>
  260. </listitem>
  261. </itemizedlist>
  262. </sect3>
  263. </sect2>
  264. <sect2 id="zend.validate.introduction.translation">
  265. <title>Meldungen übersetzen</title>
  266. <para>
  267. Prüfungsklassen bieten eine <methodname>setTranslator()</methodname> Methode mit der man
  268. eine Instanz von <classname>Zend_Translate</classname> definieren kann die Nachrichten
  269. im Falle eines Prüfungsfehlers übersetzt. Die <methodname>getTranslator()</methodname>
  270. Methode gibt die gesetzte Übersetzungsinstanz zurück.
  271. </para>
  272. <programlisting language="php"><![CDATA[
  273. $validator = new Zend_Validate_StringLength(8, 12);
  274. $translate = new Zend_Translate(
  275. 'array',
  276. array(Zend_Validate_StringLength::TOO_SHORT => 'Übersetzt \'%value%\''),
  277. 'en'
  278. );
  279. $validator->setTranslator($translate);
  280. ]]></programlisting>
  281. <para>
  282. Mit der statischen Methode <methodname>setDefaultTranslator()</methodname> kann eine
  283. Instanz von <classname>Zend_Translate</classname> gesetzt werden, und mit
  284. <methodname>getDefaultTranslator()</methodname> empfangen. Das verhindert das man den
  285. Übersetzer manuell für alle Prüfungsklassen setzen muß und vereinfacht den Code.
  286. </para>
  287. <programlisting language="php"><![CDATA[
  288. $translate = new Zend_Translate(
  289. 'array',
  290. array(Zend_Validate_StringLength::TOO_SHORT => 'Übersetzt \'%value%\''),
  291. 'en'
  292. );
  293. Zend_Validate::setDefaultTranslator($translate);
  294. ]]></programlisting>
  295. <note>
  296. <para>
  297. Wenn man ein Anwendungsweites Gebietsschema in der Registry gesetzt hat, wird
  298. dieses Gebietsschema als standardmäßiger Übersetzer verwendet.
  299. </para>
  300. </note>
  301. <para>
  302. Machmal ist es notwendig den Übersetzer in einer Prüfklasse auszuschalten. Um das zu
  303. tun kann die <methodname>setDisableTranslator()</methodname> Methode verwendet werden,
  304. welche einen boolschen Wert akzeptiert und
  305. <methodname>translatorIsDisabled()</methodname> um den gesetzten Wert zu erhalten.
  306. </para>
  307. <programlisting language="php"><![CDATA[
  308. $validator = new Zend_Validate_StringLength(8, 12);
  309. if (!$validator->isTranslatorDisabled()) {
  310. $validator->setDisableTranslator();
  311. }
  312. ]]></programlisting>
  313. <para>
  314. Es ist auch möglich einen Übersetzer zu verwenden statt eigene Meldungen mit
  315. <methodname>setMessage()</methodname> zu setzen. Aber wenn man das tut, sollte man im
  316. Kopf behalten das der Übersetzer auch mit den Meldungen arbeitet die man selbst gesetzt
  317. hat.
  318. </para>
  319. </sect2>
  320. </sect1>
  321. <!--
  322. vim:se ts=4 sw=4 et:
  323. -->