Einführung
Die Zend_Validate Komponente bietet ein Set von üblich verwendeten Prüfungen. Sie bietet
auch einen einfachen Prüf-Ketten-Mechanismus mit welchem mehrfache Prüfungen zu einem
einfachen Wert in einer benutzer-definierten Art und Weise zugeordnet werden können.
Was ist eine Prüfung?
Eine Prüfung untersucht seine Eingabe mit Obacht auf einige Anforderungen und produziert
ein boolsches Ergebnis - wenn die Eingabe erfolgreich gegen die Anforderungen geprüft
werden konnte. Wenn die Eingabe den Anforderungen nicht entspricht, kann die Prüfung
zusätzliche Informationen darüber bieten, welche der Anforderungen die Eingabe nicht
entspricht.
Eine WebAnwendung, zum Beispiel, könnte erfordern das ein Benutzername zwischen sechs
und zwölf Zeichen lang ist und dürfte nur alphanummerische Zeichen enthalten. Eine
Prüfung kann dafür verwendet werden um sicherzustellen das Benutzernamen diesen
Anforderungen entsprechen. Wenn ein gewählter Benutzername einer oder beiden
Anforderungen nicht entspricht, wäre es nützlich zu wissen welche der Anforderungen der
Benutzername nicht entsprochen hat.
Standardnutzung von Prüfungen
Prüfungen auf diesem Weg definiert zu haben, bietet die Sammlung für
Zend_Validate_Interface welche zwei Methoden definiert,
isValid() und getMessages(). Die isValid()
Methode führt eine Prüfung über die angegebenen Werte aus, und gibt nur dann
TRUE zurück wenn der Wert gegenüber den Kriterien der Prüfung entsprochen
hat.
Wenn isValid() FALSE zurück gibt, bietet
getMessages() ein Array von Nachrichten welche die Gründe für die
fehlgeschlagene Prüfung beschreiben. Die Arrayschlüssel sind kurze Strings die die
Gründe für eine fehlgeschlagene Prüfung identifizieren, und die Arraywerte sind die
entsprechend menschlich-lesbaren String Nachrichten. Die Schlüssel und Werte sind
Klassenabhängig; jede Prüfklasse definiert Ihr eigenes Set von Nachrichten für
fehlgeschlagene Prüfungen und die eindeutigen Schlüssel die diese identifizieren. Jede
Klasse hat also eine const Definition die jedem Identifikator für eine
fehlgeschlagene Prüfung entspricht.
Die getMessages() gibt die Information für Prüfungsfehler nur für den
zuletzt durchgeführten Aufruf von isValid() zurück. Jeder Aufruf von
isValid() löscht jegliche Nachricht und Fehler welche durch
vorhergehende isValid() Aufrufe vorhanden waren, weil normalerweise
jeder Aufruf von isValid() für einen unterschiedlichen Eingabewert
gemacht wird.
Das folgende Beispiel zeigt die Prüfung einer E-Mail Adresse:
isValid($email)) {
//
// E-Mail scheint gültig zu sein
//
} else {
//
// E-Mail ist ungültig; drucke die Gründe
//
foreach ($validator->getMessages() as $messageId => $message) {
echo "Validation failure '$messageId': $message\n";
}
}
]]>
Nachrichten anpassen
Prüf Klassen bieten eine setMessage() Methode mit der das Format der
Nachricht definiert werden kann die von getMessages() im Fall einer
fehlerhaften Prüfung zurückgegeben wird. Das erste Argument dieser Methode ist ein
String der die Fehlernachricht enthält. Es können Kürzel in den String eingebaut werden
welche mit den für die Prüfung relevanten Daten aufgefüllt werden. Das Kürzel
%value% wird von allen Prüfungen unterstützt; es ist verbunden mit dem Wert
der an isValid() übergeben wird. Andere Kürzel können unterstützt werden
von Fall-zu-Fall in jeder Prüfer-Klasse. Zum Beispiel ist %max% das Kürzel
welches von Zend_Validate_LessThan unterstützt wird. Die
getMessageVariables() Methode give ein Array von variablen Kürzel zurück
welche vom Prüfer unterstützt werden.
Das zweite optionale Argument ist ein String der das Template der fehlerhaften
Prüfnachricht die gesetzt werden soll identifiziert. Das ist nützlich wenn eine
Prüfklasse mehr als einen Grund für einen Fehlschlag definiert. Wenn das zweite Argument
nicht angegeben wird, nimmt setMessage() an das die spezifizierte Nachricht
für das erste Messagetemplate verwendet werden soll das in der Prüfklasse definiert ist.
Viele Prüfklassen haben nur ein Template für eine Fehlernachricht definiert, sodas es
nicht notwendig ist anzugeben welches Template für Fehlernachrichten geändert werden
soll.
setMessage(
'Der String \'%value%\' ist zu kurz; er muss mindestens %min% ' .
'Zeichen sein',
Zend_Validate_StringLength::TOO_SHORT);
if (!$validator->isValid('word')) {
$messages = $validator->getMessages();
echo $messages[0];
// "Der String 'word' ist zu kurz; er muss mindestens 8 Zeichen sein"
}
]]>
Es können mehrere Nachrichten gesetzt werden durch Verwendung der
setMessages() Methode. Dessen Argument ist ein Array welches
Schlüssel/Nachrichten Paare enthält.
setMessages( array(
Zend_Validate_StringLength::TOO_SHORT =>
'Der String \'%value%\' ist zu kurz',
Zend_Validate_StringLength::TOO_LONG =>
'Der String \'%value%\' ist zu lang'
));
]]>
Wenn die Anwendung mehr Flexibilität benötigt in der Art und Weise wie Prüffehler
gemeldet werden, kann auf die Eigenschaften durch den selben Namen zugegriffen
werden wie mit dem Nachrichten Kürzel das von einer Prüfklasse unterstützt wird.
Die value Eigenschaft ist immer in einem Prüfer vorhanden; Das ist
der Wert der als Argument von isValid() definiert wurde. Andere
Eigenschaften können von Fall zu Fall in jeder Prüfklasse unterstützt werden.
isValid('word')) {
echo 'Wort fehlgeschlaten: '
. $validator->value
. '; die Länge ist nicht zwischen '
. $validator->min
. ' und '
. $validator->max
. "\n";
}
]]>
Verwenden der statischen is() Methode
Wenn es nicht gebräuchlich ist eine gegebenen Prüfklasse zu laden und eine Instanz
des Prüfers zu erstellen, kann die statische Methode
Zend_Validate::is() verwendet werden als alternativer Stil des
Aufrufs. Das erste Argument dieser Methode ist ein Datenwert, der an die
isValid() Methode übergeben werden würde. Das zweite Argument ist ein
String, welcher mit dem Basisnamen der Prüfklasse übereinstimmt, relativ zum Namensraum
von Zend_Validate. Die is() Methode lädt die Klasse
automatisch, erstellt eine Instanz und wendet die isValid() Methode an den
Eingabedaten an.
Es kann auch ein Array von Konstruktor Argumenten übergeben werden, wenn diese für die
Prüfung benötigt werden.
Die is() Methode gibt einen boolschen Wert zurück, denselben wie die
isValid() Methode. Wird die statische is() Methode verwendet,
sind Nachrichten für Prüffehler nicht vorhanden.
Die statische Verwendung kann bequem sein für das ad hoc Verwenden eines Prüfers,
aber wenn ein Prüfer für mehrere Eingaben verwendet werden soll ist es effizienter
die nicht statische Verwendung zu benutzen, indem eine Instanz des Prüf Objektes
erstellt wird und dessen isValid() Methode aufgerufen wird.
Die Zend_Filter_Input Klasse erlaubt es auch mehrfache Filter und
Prüfklassen zu instanzieren und bei Bedarf aufzurufen um Sets von Eingabedaten zu
bearbeiten. Siehe .
Meldungen übersetzen
Prüfungsklassen bieten eine setTranslator() Methode mit der man eine
Instanz von Zend_Translate definieren kann die Nachrichten im
Falle eines Prüfungsfehlers übersetzt. Die getTranslator() Methode gibt die
gesetzte Übersetzungsinstanz zurück.
'Übersetzt \'%value%\''),
'en'
);
$validator->setTranslator($translate);
]]>
Mit der statischen Methode setDefaultTranslator() kann eine Instanz von
Zend_Translate gesetzt werden, und mit
getDefaultTranslator() empfangen. Das verhindert das man den Übersetzer
manuell für alle Prüfungsklassen setzen muß und vereinfacht den Code.
'Übersetzt \'%value%\''),
'en'
);
Zend_Validate::setDefaultTranslator($translate);
]]>
Wenn man ein Anwendungsweites Gebietsschema in der Registry gesetzt hat, wird
dieses Gebietsschema als standardmäßiger Übersetzer verwendet.
Machmal ist es notwendig den Übersetzer in einer Prüfklasse auszuschalten. Um das zu
tun kann die setDisableTranslator() Methode verwendet werden, welche einen
boolschen Wert akzeptiert und translatorIsDisabled() um den gesetzten
Wert zu erhalten.
isTranslatorDisabled()) {
$validator->setDisableTranslator();
}
]]>
Es ist auch möglich einen Übersetzer zu verwenden statt eigene Meldungen mit
setMessage() zu setzen. Aber wenn man das tut, sollte man im Kopf behalten
das der Übersetzer auch mit den Meldungen arbeitet die man selbst gesetzt hat.