Facebook
Twitter
Google+
Kommentare
0

Eigene Validatoren durch erweitern von Zend_Validate_Abstract

G’day zusammen,
für diejenigen unter euch die schonmal mit der Zend_Validate Komponente gearbeitet haben,
wird dieser Artikel nichts neues sein, für alle anderen folgt hier eine kurze Einführung:

Zend_Validate und was ist überhaupt ein Validator?
Ein Validator untersucht eine Eingabe auf eine oder mehrere Anforderungen und liefert TRUE zurück, wenn alle Anforderungen erfüllt werden. Falls nicht alle Anforderungen erfüllt wurden, liefert der Validator FALSE zurück. Zusätzlich kann ein Validator beim nicht Erfüllen einer oder mehrerer Anforderungen Fehlermeldungen zurückgeben, die die fehlenden Anforderungen beschreiben.
Das Zend Framework liefert von haus aus eine Reihe von Validatoren mit, die unter anderem prüfen können ob eine Eingabe ein gültiger Floatwert ist oder es sich bei der Eingabe um eine gültige Emailadresse handelt etc. (Die verfügbaren Validatoren können hier nachgelesen werden).

Zend_Validate_Interface oder wie schreibe ich meinen eigenen Validator?
Wie ihr vielleicht schon in der online Dokumentation des Zend Frameworks gesehen habt, gibt es eine große Anzahl von Validatoren die bereits vorhanden sind, nun kann es aber durchaus passieren, dass ein spezieller Validator benötigt wird, dessen Anforderungen nicht durch das Framework abgedeckt werden können, also müssen wir uns selbst die Arbeit machen und uns einen eigenen Validator bauen.
Um das zu erreichen werfen wir zunächst einen Blick auf das Zend_Validate_Interface, dieses definiert zwei Methoden, isValid() und getMessages() welche von eigenen Prüfklassen implementiert werden müssen. Jetzt sehen wir uns mal Zend_Validate_Abstract ein bisschen genauer an und stellen fest, dass diese abstrakte Klasse bereits Methoden für das Message Handling implementiert u.a. auch schon getMessages() => schön, eine Sache weniger die uns belastet ;) . Wir müssen nun lediglich unsere eigene Validatorklasse durch Zend_Validate_Abstract erweitern und unsere isValid() Methode implementieren.

<?php
class DT_Validate_MyValidator extends Zend_Validate_Abstract
{
	public function isValid($value)
	{
	}
}
?>

Um das Beispiel einfach zu halten wollen wir mit unserem eigenen Validator nur prüfen ob ein String genau 6 Zeichen lang ist. Natürlich gibt es schon einen StringLengthValidator aber um euch mal eine Vorstellung zu geben sollte dieses Beispiel ausreichen.

<?php
class DT_Validate_MyValidator extends Zend_Validate_Abstract
{
    const MSG_INVALID = 'invalid';
    protected $_messageTemplates = array(
        self::MSG_INVALID => 'Der String ist länger als 6 Zeichen.'
    );

    public function isValid($value)
    {
        if (strlen($value) !== 6)
        {
            $this->_error(self::MSG_INVALID);
            return false;
        }

        return true;
    }
}
?>

Das wars schon ;) Wir haben lediglich unsere eigene isValid() Funktion und unsere eigenen Messages implementiert und können nun unseren Validator wie jeden anderen aus dem Zend Framework benutzen.

Einfache Verwendung:

    $validator = new DT_Validate_MyValidator();

    $value = '1234567';

    if (!$validator->isValid($value))
    {
        echo '<pre>';
        print_r($validate->getMessages());
        die();
    }
    echo 'valid!';

Verwendung innerhalb einer Validator Chain:

    $value = '1234567@d-';
    $validatorChain = new Zend_Validate();

    $validatorChain->addValidator(new DT_Validate_MyValidator())
        ->addValidator(new Zend_Validate_Alnum());

    if (!$validatorChain->isValid($value))
    {
        echo '<pre>';
       	print_r($validatorChain->getMessages());
       	die();
    }

     echo 'valid!';

Die Verwendung innerhalb einer Zend_Filter_Input Komponente erfolgt analog.
Nun wünsche ich viel Spaß beim custom validator schrauben ;)

Über den Autor

devtalk

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen