Zend_Validate.xml 17 KB

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