Aus den Zend Framework Blogs

Donnerstag, 04.03.2010

Irgendwie ist es ja total sinnlos, laufend aktuelle Links zu Blogbeiträgen zum Zend Framework zu sammeln und diese dann nicht zu verbloggen, und diesem sinnlosen Treiben werde ich nun Einhalt gebieten und einfach diese gesammelten Links hier in diesem Blog veröffentlichen, und zwar jetzt und zwar auch in der Reihenfolge des Eingangs:

So, das war es erst einmal. Den nächsten Schwung Zend Framework Beiträge gibt es dann beim nächsten Mal.

http://www.littlehart.net/atthekeyboard/2010/01/27/creating-usable-forms-with-zend-framework/

Tweet this via redir.ec

Zend Framework FAQ: Wo platziere ich am besten meine Validatoren und Filter, im Controller, im Formular oder im Model?

Samstag, 09.01.2010

Bei der zweiten Abstimmung für die Zend Framework Fragestunde, wurde diese Frage mit 29% der Stimmen auf Platz 1 gewählt: Wo platziere ich am besten meine Validatoren und Filter, im Controller, im Formular oder im Model? Setze ich dabei Zend_Filter_Input ein? Es hat ein wenig gedauert (mehr als zwei Monate), bis ich nun endlich dazu gekommen bin, mich dieser Frage anzunehmen. Dies hatte mehrere Gründe, denn ich war sowohl beruflich als auch privat sehr eingespannt. Bin ich eigentlich immer noch, aber heute habe ich mir die Zeit genommen. Sonst wird die Fragestunde auch eher langweilig und wieder schnell vergessen.

Ein Grund, weshalb die Antwort so lange auf sich warten liess, war auch, dass diese Frage auf den ersten Blick gar nicht so leicht zu beantworten ist. Der Frage ist schon zu entnehmen, dass es viele Möglichkeiten gibt. Werden die Validatoren und Filter im Controller, im Formular oder im Model platziert? Verwendet man lieber Zend_Form oder Zend_Filter_Input? Ich werde hier nun zwei Lösungswege vorstellen, möchte aber auch darauf hinweisen, dass es weitere sinnvolle und gute Lösungen gibt. Und eigentlich ist die Frage auch etwas ungenau gestellt. Denn das Platzieren der Validatoren und Filter ist relativ klar. Unklar ist eher, wann und wo das Filtern und Validieren ausgeführt wird. Doch dazu gleich mehr.

Ansatz 1: Zend_Form zum Filtern und Validieren verwenden

Es ist nahe liegend, für das Filtern und Validieren von Eingabedaten Zend_Form zu verwenden. Diese Komponente bietet bereits alles, was man braucht. Es ist recht einfach, einem Formular beliebige Filter und Validatoren zuzuordnen. Dies ist auch meiner Meinung nach gut im Referenzhandbuch für Zend_Form erläutert, so dass ich dies hier nicht wiederholen möchte. Auch im Quickstart findet sich ein Beispiel. Komplizierter ist aber die Frage, wo in einer Anwendung die isValid() Methode einer Zend_Form Instanz aufgerufen wird.

Als erstes bietet sich der Einsatz im Action-Controller an. Dies ist auch nahe liegend, da der Controller unter anderem auch für die Verarbeitung und Weitergabe der Eingabedaten zuständig ist. Ein Model oder gar eine Formularinstanz sollte nie direkt auf die Daten zugreifen, die über den Request des Benutzers eingehen. In der Regel könnte solch ein Abfrage mehr oder minder wie im folgenden Beispiel aussehen. Es wird eine Instanz des Formulars erstellt, dann wird geprüft, ob das Formular gültig ist. Falls ja, wird erst die Instanz des Models erstellt und dann kann wie in diesem Beispiel ein neues Passwort für einen Benutzer erstellt werden.

PHP:
  1. function passwordAction()
  2. {
  3.   // Formular für neues Benutzerpasswort
  4.   $form = new App_Form_UserPassword();
  5.  
  6.   // prüfen ob Formular mit Button versandt wurde
  7.   if ($this->getRequest()->isPost() && !is_null($this->getRequest()->getPost('submit_user_password')))
  8.   {
  9.     // prüfen ob Eingaben gültig sind
  10.     if ($form->isValid($this->getRequest()->getPost()))
  11.     {
  12.       // Model Instanz erstellen
  13.       $user = new App_Model_Users();
  14.  
  15.       // Neues Passwort generieren
  16.       $user->generatePassword($form->getValue('user_email'));
  17.  
  18.       // umleiten auf Bestätigung
  19.       return $this->_redirect($this->getHelper('url')->url(array('action' => 'password-sent', 'id' => $user->getId())));
  20.     }
  21.  
  22.     // Daten sind ungültig
  23.     else
  24.     {
  25.       // Fehlermeldung festlegen
  26.       $form->setDescription('message_user_password_error');
  27.     }
  28.   }
  29.  
  30.   // Formular an View übergeben
  31.   $this->view->passwordForm = $form;
  32. }

Diese Verwendung ist nahe liegend und sieht auf den ersten Blick auch solide aus. Und es funktioniert auch soweit ganz gut. Das Problem ist nur, was man macht, wenn ein Formular z.B. an verschiedenen Stellen einer Anwendung zum Einsatz kommt. Dann muss in der jeweiligen Aktionsmethode des Action-Controller diese Prüfung laufend wiederholt wird. Ich denke da an den Ansatz der "thin controller and fat models" und möchte die Aktionsmethoden so einfach wie möglich halten. Deshalb möchte ich die eigentliche Prüfung der Daten lieber aus dem Controller heraus in das Model verlagern.

Dies hat auch den Vorteil, dass die Prüfung der Daten auch gewährleistet ist, falls ein Model einen neuen Datensatz anlegen soll, der nicht über ein Web-Formular in der Anwendung landet (z.B. beim Importieren von Daten aus einer externen Quelle). Und es macht keinen Sinn, die Prüfung der Eingabedaten redundant im Controller und im Model zu implementieren.

Zuerst schauen wir uns den Ausschnitt aus dem Model an. Es erstellt eine Instanz des Formulars und überprüft die Korrektheit der Daten, wenn das Formular abgeschickt worden ist. Wenn die Eingaben korrekt ware, wird ein neues Passwort erstellt und gespeichert, danach wird eine Mail mit dem Passwort versandt. Wenn dies nicht geklappt hat oder das Formular nicht versandt wurde, wird die Instanz des Formulars zurück gegeben.

PHP:
  1. class App_Model_Users
  2. {
  3.     public function generatePassword(array $data = array())
  4.     {
  5.         // Formular für neues Benutzerpasswort
  6.         $form = new App_Form_UserPassword();
  7.        
  8.         // prüfen ob Formular mit Button versandt wurde
  9.         if (isset($data['submit_user_password'])) {
  10.             // prüfen ob Eingaben gültig sind
  11.             if ($form->isValid($data)) {
  12.                 // Daten übernehmen, Passwort erstellen und speichern
  13.                 $this->setProperties($form->getValues());
  14.                 $this->setPassword(App_Model_Users::generatePassword());
  15.                 $this->save();
  16.                
  17.                 // Mail mit neuem Passwort aufbauen und versenden
  18.                 $mail = new Zend_Mail();
  19.                 $mail->setFrom('webmaster@mydomain.de');
  20.                 $mail->addTo($this->getEmail());
  21.                 $mail->setSubject('Neues Passwort');
  22.                 $mail->setBodyText('Passwort: ' . $this->getPassword());
  23.                 $mail->send();
  24.                
  25.                 // Registrierung erfolgreich
  26.                 return true;
  27.            
  28.             } else {
  29.                 // Fehlermeldung festlegen
  30.                 $form->setDescription('message_user_password_error');
  31.             }
  32.         }
  33.        
  34.         // Formularobjekt zurück geben
  35.         return $form;
  36.     }
  37. }

Als nächstes schauen wir uns den Action-Controller an. Hier wird nun nicht mehr die Instanz des Formulars, sondern die des Models erstellt. Es gibt eine spezielle Methode für das Erstellen eines neuen Passworts. Diese gibt entweder ein true oder eine Formularinstanz zurück.

PHP:
  1. class UserController extends Zend_Controller_Action   
  2. {
  3.     public function passwordAction()
  4.     {
  5.         // Model für Benutzer instanzieren
  6.         $user = new App_Model_Users();
  7.        
  8.         // Passwort erstellen
  9.         $form = $user->generatePassword($this->getRequest()->getPost());
  10.        
  11.         // Prüfen auf Redirect
  12.         if (true === $form) {
  13.             // umleiten auf Bestätigung
  14.             return $this->_redirect($this->getHelper('url')->url(array('action' => 'password-sent', 'id' => $user->getId())));
  15.         }
  16.        
  17.         // Übergebe Formular an den View
  18.         $this->view->passwordForm = $form;
  19.     }
  20. }

Wir verwenden nun also das Zend_Form Objekt innerhalb unseres Models und der Action-Controller muss sich um fast nichts mehr kümmern. Nur die Weiterleitung und die Übergabe an den View sind noch für ihn zu erledigen.

Ansatz 2: Zend_Filter_Input zum Filtern und Validieren verwenden

Verzichtet man aus welchen Gründen auch immer auf den Einsatz von Zend_Form, kann man das Filtern und Validieren alternativ auch von Zend_Filter_Input erledigen lassen. Die Funktionsweise ist im Referenzhandbuch erklärt, so dass ich mir die Einführung von Zend_Filter_Input an dieser Stelle sparen möchte.

Der Einsatz innerhalb eines Models ist aber recht schnell dargestellt. Die Unterschiede zum Einsatz von Zend_Form sind marginal.

PHP:
  1. class App_Model_Users
  2. {
  3.     public function generatePassword(array $data = array())
  4.     {
  5.         // Zend_Filter_Input Instanz
  6.         $input = new App_Filter_UserPassword();
  7.        
  8.         // prüfen ob Formular mit Button versandt wurde
  9.         if (isset($data['submit_user_password'])) {
  10.             // prüfen ob Eingaben gültig sind
  11.             if ($input->isValid($data)) {
  12.                 // Daten übernehmen, Passwort erstellen und speichern
  13.                 $this->setProperties($input->getEscaped());
  14.                 $this->setPassword(App_Model_Users::generatePassword());
  15.                 $this->save();
  16.                
  17.                 // Mail mit neuem Passwort aufbauen und versenden
  18.                 $mail = new Zend_Mail();
  19.                 $mail->setFrom('webmaster@mydomain.de');
  20.                 $mail->addTo($this->getEmail());
  21.                 $mail->setSubject('Neues Passwort');
  22.                 $mail->setBodyText('Passwort: ' . $this->getPassword());
  23.                 $mail->send();
  24.                
  25.                 // Registrierung erfolgreich
  26.                 return true;
  27.         }
  28.        
  29.         // Nicht erfolgreich
  30.         return false;
  31.     }
  32. }

Da ich selber Zend_Form sehr gerne und viel einsetze, habe ich Zend_Filter_Input noch nicht so häufig in der Praxis eingesetzt. Aber es ist durchaus möglich, wie das Beispiel zeigt.

Fazit

Das Filtern und Validieren von Eingabedaten ist im Model meistens am besten aufgehoben. Ob man nun Zend_Form oder Zend_Filter_Input einsetzt, bleibt einem selbst überlassen. Beides ist möglich.

Wenn es Fragen gibt oder ihr dies oder jenes völlig anders macht, stehen dafür nun die Kommentare bereit. Ich freue mich auf euer Feedback!

Tweet this via redir.ec

Aus den Zend Framework Blogs

Freitag, 01.01.2010

So, da werde ich mal den ersten Zend Framework Beitrag des Jahres 2010 veröffentlichen. Und was wäre das besser als ein paar kommentierte Links.

Also, wenn dies nicht der erste Beitrag zum Zend Framework in 2010 war, dann weiss ich auch nicht mehr, was die anderen zum Jahreswechsel machen. Ihr sollt feiern und nicht bloggen! Oder wenn schon bloggen, dann wie ich den Beitrag geplant veröffentlichen... ;-)

Tweet this via redir.ec

Aus den Zend Framework Blogs (Spezial: Doctrine und Zend Framework)

Mittwoch, 16.12.2009

Wie bereits angekündigt, gibt es dieses Mal einen speziellen Beitrag mit Links zum Zend Framework. Heute werden nämlich nur Beiträge gelistet, die sich mit dem Einsatz von Doctrine im Zend Framework beschäftigen. Dies ist besonders spannend, da es keinen eigenen ORM Layer mehr für das Zend Framework geben wird. Zend_Entity wurde zugunsten der Doctrine 2 Integration aufgegeben. Auf geht es:

Wer sich für dieses Thema interessiert, hat nun erst einmal einiges zum Durcharbeiten. Beim nächsten Beitrag aus der Rubrik "Aus den Zend Framework Blogs" geht es dann wieder kunterbunt weiter. Noch habe ich 15 weitere Links (Stand jetzt) in der Hinterhand... ;-)

Tweet this via redir.ec

Aus den Zend Framework Blogs

Mittwoch, 18.11.2009

Hatte in den letzten Tagen weniger Zeit zum bloggen. Die Arbeit, die Familie und anderes hielt mich davon ab. Um langsam wieder rein zu kommen, folgen nun erst einmal wieder ein paar lesenswerte Links rund um das Zend Framework. Diese sind teilweise schon einige Wochen alt, also nicht böse sein, falls ihr diese ollen Kamellen schon kennt. ;-)

Feedback und Ergänzungen sind wie immer erwünscht. Ich könnte nun noch weiter machen, habe derzeit noch 14 andere Links. Die kommen dann aber später, will euch nicht überfordern... ;-)

Tweet this via redir.ec

Zend_Entity kommt doch nicht, dafür Zend_Doctrine

Freitag, 30.10.2009

Benjamin Eberlei hat gestern abend in der Mailingliste angekündigt, dass er in Zukunft nicht mehr an Zend_Entity weiter entwickeln wird. Hauptgründe sind, dass seine ganze Freizeit derzeit für die Entwicklung drauf geht, er der einzige größere Contributor ist und dass eine stabile Version noch 4 bis 6 Monate dauern würde und somit zu spät für eine neue Komponente im 1.x Major Release. Auch wenn ich das sehr schade finde, kann ich seine Gründe sehr gut nachvollziehen.

Es gibt aber auch gute Nachrichten. Stattdessen soll es in Zukunft eine Unterstützung für Doctrine im Zend Framework geben. Benjamin möchte seine Zeit somit lieber in diese Unterstützung stecken, da Doctrine 2 früher verfügbar sein wird, als eine mögliche Zend_Entity Komponente.

Was nun mit der bisherigen Entwicklung von Zend_Entity passieren wird, ist unklar. Immerhin sollen bereits 50% - 60% des Funktionsumfangs umgesetzt sein.

Tweet this via redir.ec

Models im Zend Framework, zum Dritten in 3 Jahren

Donnerstag, 24.09.2009

Traditionen müssen gewahrt werden. Anscheinend ist der September immer der Monat, in dem ich mich intensiver mit dem Thema Models im Zend Framework beschäftige. Bereits vor 3 Jahren und im letzten Jahr habe ich darüber geschrieben, dass das Zend Framework im eigentlichen Sinne noch keine Implementation des Ms vom Model-View-Controller bereit stellt. Das Proposal, das im letzten Jahr noch vielversprechend aussah, ist mittlerweile wieder eingeschlafen. Und auch das Kapitel über Zend_Model wurde bisher immer noch nicht geschrieben. Doch wie ist denn nun der Stand der Dinge?

Über das Thema ist einiges in den Blogs zu lesen. Federico Cargnelutti hat im März eine kleine Serie zum Thema Domain-Driven-Design veröffentlicht und vor einigen Tagen noch das Thema DALs, DAOs und DataMapper aufgegriffen. Wer sich darunter nichts vorstellen kann, lese hier weiter:

Padraic Brady schreibt derzeit an seinem Open Book zum Zend Framework und hat auch schon zwei Kapitel zum Thema Models veröffentlicht. Diese sind unbedingt lesenswert:

Auch bei Matthew Weier O'Phinney ist eine kleine Artikelserie erschienen, die aber schon einige Monate auf dem Buckel hat. Er schreibt über den Einsatz von Zend_Form und Zend_Acl in einem Model sowie über eine Model Infrastruktur:

Und was ist nun offiziell im Zend Framework im Gange? Nicht wenige würden sich sehr darüber freuen, wenn das Zend Framework mehr Unterstützung zum Thema Models bereit stellen würde. Es gibt dabei zwar viele Ansätze und keinen goldenen Weg, aber dennoch würden Tipps und Anregungen die Arbeit erleichtern. Und dann noch ein paar nützliche und durchdachte Komponenten dazu, dann wäre alles gut. Und was soll ich sagen? Es kommt langsam Bewegung in die Sache, denn derzeit werden von Benjamin Eberlei zwei neue Komponenten vorbereitet: Zend_Entity und Zend_Db_Mapper. Der Proposal klingt sehr spannend und in ähnlicher Form wird dieser Ansatz auch schon im QuickStart des Zend Frameworks eingesetzt. Auch dort gibt es Mapper und Model Klassen sowie Instanzen von Zend_Db_Table.

Es bleibt also spannend.

http://www.ralfeggert.de/2006/09/07/fehlende-komponenten-im-zend-framework/

Tweet this via redir.ec


Better Tag Cloud