ZF2 – ein Cookbook

In 3 Schritten einen URL-Shortener mit dem neuen Zend Framework 2 bauen [Schritt 2]
Kommentare

Den InputFilter gab es auch schon in ZF1, allerdings hat er nach der Einführung der Zend_Form-Komponente eine weitaus geringere Rolle gespielt als jetzt wieder in ZF2. Wir können erkennen, dass das orig_url-Feld

Den InputFilter gab es auch schon in ZF1, allerdings hat er nach der Einführung der Zend_Form-Komponente eine weitaus geringere Rolle gespielt als jetzt wieder in ZF2. Wir können erkennen, dass das orig_url-Feld über die Textlänge eingeschränkt wird, aber natürlich wird auch überprüft, ob ein valider URI übergeben wurde. Das Feld trim_path hingegen wird mit einem regulären Ausdruck überprüft, der sicherstellt, dass nichts anderes als Buchstaben, Ziffern, Unter- und Bindestrich enthalten sind – andernfalls wird eine Fehlermeldung generiert. Für beide Felder wird ein StringTrim-Filter angewendet.

Form und InputFilter werden nun erstellt und miteinander verknüpft und zwar in der Datei Module.php statt in einer neuen Methode getServiceConfig() (Listing 10).

Listing 10

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'ZhortyFormTrim' => function($sm) {
                $form = new FormTrim();
                $form->setInputFilter(new FormTrimFilter());
                return $form;
            },
        ),
    );
}

Die Form- und DB-Vorbereitungen sind nun abgeschlossen, jetzt ist es Zeit den TrimContoller bzw. dessen indexAction() zu befüllen. Dazu brauchen wir zuerst unsere Form, und diese kommt aus dem ServiceLocator (Listing 11).

Listing 11

getServiceLocator();
        $form = $sm->get('ZhortyFormTrim');
        return new ViewModel(array('form' => $form));
    }
}

Der ServiceLocator steht über die Methode getServiceLocator() im Controller bereit. Es fehlt nur noch ein get()-Aufruf mit dem Identifier der Form, und schon hat man eine Form-Instanz. Diese stecken wir in die View, bzw. in eine neue ViewModel-Instanz, und geben diese zurück. Wir hätten auch einfach ein Array zurückgeben können, die definierten Werte landen in der View. In der View selbst ist es jetzt möglich direkt (ohne $this->) darauf zuzugreifen. Allerdings hat die Form – wie oben beschrieben – keine Decorator implementiert. Diese waren in ZF1 maßgeblich verantwortlich, dass ein echo $form in der View das komplette Formular aufbauen konnte. Für einen ersten Entwurf war das auch sicherlich hilfreich, das Customizing nur über Style Sheets war jedoch auch sehr mühsam. In ZF2 hingegen wird jedes Formfeld einzeln betrachtet. Die view/zhorty/trim/index.phtml könnte wie in Listing 12 aussehen.

Listing 12

Trim your URI

prepare(); $form->setAttribute('action', $this->url('zhorty-trim')); $form->setAttribute('method', 'post'); ?> form()->openTag($form) ?>
formLabel($form->get(‚orig_url‘)) ?>
formInput($form->get(‚orig_url‘)) ?>

formElementErrors($form->get(‚orig_url‘), array(‚class‘ => ‚alert-error‘)) ?>

formLabel($form->get(‚trim_path‘)) ?>
formInput($form->get(‚trim_path‘)) ?>

formElementErrors($form->get(‚trim_path‘), array(‚class‘ => ‚alert-error‘)) ?>

formButton($form->get(’submit‘)) ?>

form()->closeTag() ?>

Ein kleiner Hinweis für den URL-ViewHelper: $this->url() kreiert einen validen URL, und zwar aus einem Routing-Identifier. Es wird also kein Controller oder relativer Pfad angegeben, sondern der Wert der Route aus der module.config.php. Das ist eine sehr nette Sache: So kann die Route applikationsweit verändert werden, ohne dass der Code angepasst werden muss. Das Ganze sollte jetzt im Browser getestet werden und aussehen wie in Abbildung 2.

Abb. 2: Formular in Standard-ZF2-Applikation

Es können auch schon Werte eingegeben und abgeschickt werden, allerdings werden sie bislang ja noch nicht verwendet oder validiert. Das holen wir jetzt nach. Um Input-Daten zu verwalten, hat sich als BestPractice die Verwendung von Entities herausgestellt. Wir benötigen eine neue Datei src/Zhorty/Entity/Trim.php (Listing 13).

Listing 13

id;
    }
    
    public function getOrigUrl ()
    {
        return $this->origUrl;
    }

    public function getTrimPath ()
    {
        return $this->trimPath;
    }

   public function setId ($id)
    {
        $this->id = $id;
        return $this;
    }
    
  public function setOrigUrl ($origUrl)
    {
        $this->origUrl = $origUrl;
        return $this;
    }

  public function setTrimPath ($trimPath)
    {
        $this->trimPath = $trimPath;
        return $this;
    }
}
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -