Aus den Zend Framework Blogs

Donnerstag, 04.03.2010 Lesenswertes |

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/

Zend Framework 1.10 bringt viel Neues mit sich

Freitag, 22.01.2010 Releases |

Das Release der Beta Version vom Zend Framework 1.10 habe ich nachrichtentechnisch zwar noch verpasst. Doch es geht Schlag auf Schlag weiter. Gestern wurde der 1. Release Candidate der 1.10 Version veröffentlicht.Das neue Release kann wie gewöhnt auf der Download Seite heruntergeladen werden. Das passende Changelog zum Release 1.10.0 ist bisher noch nicht online, wird aber sicherlich bald nachgeholt. Die stabile Version wird für den nächsten Dienstag (26.1.) angekündigt. Mal schauen, ob das so klappt.

Das neue Release brachte auf der Zend Framework Website aber auch weitere Neuerungen mit sich. So wurde die Downloadseite überarbeitet. Dort finden sich neben den Downloads für 1.10.0 auch die Downloads für die aktuelle stabile Version 1.9.7. Zusätzlich können weitere Packages von der Zend Website heruntergeladen werden, was jedoch eine Registrierung erfordert. Unter anderem gibt es dort auch ein Package mit dem Zend Framework und dem Zend Server in der Community Edition.

Auch die Manual Seite wurde überarbeitet. Ab sofort findet sich dort das Referenzhandbuch für die neue Version 1.10. Aber auch die älteren Release bis zu 1.0 können nun direkt angezeigt werden. Dies finde ich besonders hilfreich, da ich einige Zend Framework Projekte zu betreuen habe, die noch auf älteren Releases basieren und bis zum Relaunch immer mal wieder ausgebaut werden müssen. Da ist es sehr nützlich, dass die entsprechenden Manuals nun auch einfach online zu finden sind.

Drei Security Releases wurden veröffentlicht

Dienstag, 12.01.2010 Releases |

Gestern Abend wurden auf einen Schlag gleich drei neue Releases veröffentlicht. Diese waren notwendig, da eine ganze Reihe von möglichen Sicherheitslücken in einem Security Audit gefunden und geschlossen worden sind. Da dies alle bisherigen Releases betrifft, wurden für die letzten drei Mini-Releases neue Versionen bereit gestellt:

Ein paar weitere Details finden sich bei Padraic Brady, der maßgeblich daran beteiligt war, in der Devzone von Zend sowie beim PHP Magazin. Also auf gehts, liebe Freunde des gepflegten Updatesm, und ran an die Downloads.

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

Samstag, 09.01.2010 Fragestunde |

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!

Aus den Zend Framework Blogs

Freitag, 01.01.2010 Lesenswertes |

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... ;-)

Auswertung Tippspiel, wann kommt ZF 2.0

Mittwoch, 30.12.2009 Allgemein |

Ich habe damals vor vielen Monden einmal in meinem alten Blog ein kleines Tippspiel veranstaltet. Es ging um die Frage, wann das Zend Framework Release 2.0 erscheinen wird. Gefragt hatte ich am 10.7.2009 und man musste bis zum 30.09.2009 seinen Tipp abgeben. Als Anreiz habe ich drei Ausgaben von meinem überarbeiteten Zend Framework Buch, das aber natürlich noch gar nicht erschienen ist (wie auch?).

Da sich so langsam eine Art von Termin für das Release 2.0 am Horizont abzeichnet (gleich mehr), habe ich mal die Tipps in eine Reihenfolge gebracht:

  • 30.10.2009: Manuel
  • 11.11.2009: Daniel
  • 15.11.2009: EG
  • 06.12.2009: Tobias
  • 10.12.2009: Renner
  • 21.12.2009: LudwigR
  • 01.01.2010: Marek
  • 15.01.2010: Stefan II.
  • 20.01.2010: Jonathan
  • 02.02.2010: Michael
  • 09.02.2010: Stephan
  • 10.02.2010: Paul
  • 20.02.2010: Dominiki
  • 30.02.2010: Adrian
  • 06.03.2010: Michael II.
  • 09.03.2010: Ralf (ein anderer)
  • 10.03.2010: Michael III.
  • 14.03.2010: Danny
  • 23.03.2010: Obby
  • 31.03.2010: Ulf
  • 01.04.2010: Stefan I.
  • 05.04.2010: René, Vincent
  • 12.04.2010: ThomasK
  • 15.04.2010: MRKS
  • 17.04.2010: Bau
  • 04.05.2010: Ralf (das bin ich)
  • 07.05.2010: Dirk
  • 12.06.2010: Hakan
  • 22.06.2010: Ulrich
  • 30.06.2010: Timo
  • 03.07.2010: Axel
  • 07.07.2010: Hans
  • 01.05.2011: mtthff

Einige der Tipps sind jetzt schon aus dem Rennen und für die meisten anderen sehe ich auch eher schwarz. Warum? Hier schreibt Matthew, dass das ZF Release 2.0 voraussichtlich im letzten Quartal 2010 erscheinen wird. Deshalb werden die drei Gewinner wohl aus den letzten 4 bis 5 Tipps stammen. Aber wissen werden wir dies erst in einer langen Weile.

http://framework.zend.com/wiki/display/ZFDEV2/Zend+Framework+2.0+Roadmap?focusedCommentId=19005610#comment-19005610

Internationale PHP Konferenz Spring Edition 2010

Donnerstag, 24.12.2009 News |

Wir haben zwar noch 2009, aber das nächste Jahr 2010 steht ja bereits in den Startlöchern. Habe es gestern erst bei Aufwärmübungen im Park gesehen. In 2010 finden auch wieder die Frühlingsausgabe der Internationalen PHP Konferenz statt, oder auf deutsch IPC Spring Edition 2010. Die Konferenz findet vom 31. Mai bis 2. Juni 2010 in Berlin statt. Da ich beide Konferenzen in 2009 verpasst habe, möchte ich 2010 auf jeden Fall wieder dabei sein.

Derzeit bin ich am Überlegen, ob ich dieses Mal auch eine Session zum Zend Framework anbieten soll. Die Sessions sind bekanntlich auf 60 Minuten begrenzt und werden in der Regel auf Englisch oder Deutsch gehalten. Bis zum 11. Januar 2010 kann man noch Vorschläge für Sessions und auch die längeren Workshops einreichen. Ich überlege gerade, welches Thema zum Zend Framework die werte Leserschaft wohl am meisten interessieren würde. Ich hoffe, mir fällt noch etwas ein. Ansonsten nehme ich auch gerne Vorschläge und Wünsche entgegen...

http://it-republik.de/konferenzen/ipc2010se/cfp/

Meine Top 5 Web-Unwörter des Jahres 2009

Mittwoch, 23.12.2009 Nonsens |

Ich greife mal den Beitrag von Andreas auf und veröffentliche auch meine Top 5 Web-Unwörter des Jahres 2009.

  1. Web 3.0, oder Web 4.0 oder Web 5.0, ... weil viele hoffen, nur weil sie sich dies auf die Fahne schreiben, sie nicht noch mal den Zug verpassen, wie es ihnen schon bei Web 2.0 passiert ist
  2. in the Clowd Cloud, weil man dort so schön wolkenlos herum schwadronieren kann
  3. the next big thing, weil jeder darauf hofft, dass zu erreichen, was andere nur per Zufall erreicht haben, zur richtigen Zeit die richtige Idee richtig umgesetzt zu haben
  4. den Hash-Tag #fail, weil viele, die sich über das Scheitern andere freuen, selber selten was auf die Reihe kriegen...
  5. Google Wave, da halte ich mich an Andreas, habe das nämlich auch nicht wirklich verstanden, und ich habe auch noch 16 Invites übrig, wer also möchte...

Und welches sind Eure Top 5 Web-Unwörter des Jahres? Bis zum Ende des Jahres will ich die hören, also bitte kommentieren oder trackbacken.

Zend Framework 1.10.0alpha1 wurde veröffentlicht

Dienstag, 22.12.2009 Releases |

Pinneberg liegt unter eine dicken Schneedecke (ist sehr außergewöhnlich) und was fällt den Zend Framework Entwickler ein? Genau, sie veröffentlichen einfach ein neues Release, und zwar die erste Alpha-Version vom Zend Framework 1.10.0. Auf der Devzone findet sich die offizielle Ankündigung, das passende Changelog ist aber noch nicht zu entdecken. Das Manual wurde noch nicht aktualisiert, eine vorläufige Version der Doku zu 1.10.0 findet sich aber bei Mikael. Die neuen Features könnt ihr der Ankündigung in der Devzone entnehmen, die wichtigsten aus meiner Sicht sind die neue Komponente Zend_Barcode, die Verbesserung von Zend_Feed sowie die Erweiterung von Zend_Tool.

Ebenfalls erwähnenswert ist die Überarbeitung des Manuals. Es gibt nun ein neues Hauptkapitel "Learning Zend Framework", in dem Tutorials Platz finden sollen. Der Reference Guide ist natürlich weiterhin vorhanden. In dem neuen Hauptkapitel finden sich bereits der Quick Start Guide und weitere Einführungen zu Autoloading, Plugins, Zend_Layout, Form Dekorierer, Authentifizierung und Autorisierung, Zend_Search_Lucene sowie Zend_Paginator wieder. Eine gute Sache, wie ich finde!

Auch interessant ist der Plan für die nächsten Releases, den ich hier mal hinein nehmen möchte.

  • 1.10.0alpha1: heute
  • 1.9.7: Dienstag, 5. Januar 2010
  • 1.10.0beta1: Donnerstag, 7. Januar 2010 oder Freitag, 8. Januar 2010
  • 1.10.0rc1: Donnerstag, 14. Januar 2010
  • 1.10.0: Donnerstag, 21. Januar 2010

Da es sich um ein Alpha-Release handelt, sind alle aufgefordert es zu testen, um evtl. vorhandene Probleme schnell identifizieren und ausräumen zu können. Also auf gehts! :-)

Bug Hunt Days Dezember 2009 / Bug Statistiken

Dienstag, 22.12.2009 News |

Die letzten Bug Hunt Days des Jahres fanden am 17. und 18.12.2009 statt. Wenn ich die Auswertungen im Issue Tracker richtig deute, wurden dieses Mal deutlich weniger Bugs geputzt als zu den vorherigen Bug Hunt Days. In dieser Liste werden nur 36 Bugs ausgeworfen, die an den beiden Tagen auf erledigt gesetzt werden konnten. Oftmals gibt es aber noch kleinere Abweichungen zu den offiziellen Zahlen. Dennoch sind 36 viel weniger als bisher. Zur Erinnerung hier mal die bisherigen Zahlen:

In diesem Zusammenhang ist übrigens dieser Chart ganz interessant. Es zeigt den Verlauf der neuen und gelösten Bugs pro Woche. Habe mir die Zahlen mal genauer angesehen, dabei ist mir folgendes aufgefallen. Der Höchststand an Bug war in der KW 33/2009 mit insgesamt 1366 offenen Bugs erreicht. Davor ging es stetig bergauf. Nach dem Höchststand sind derzeit noch 1313 Bugs offen, d.h. in den letzten bummelig 20 Wochen konnten ingesamt nur bummelig 50 abgebaut werden. Im Schnitt ist in den letzten 2 Jahren pro Woche ein Delta (Anzahl gemeldeter minus gelöster Bugs) von 12,5 neue Bugs hinzugekommen. Da die Bug Hunt Days einmal im Monat stattfinden, müssten jedes Mal 50 Bugs gefixt werden, damit die Zahl der offenen Bugs nicht dauerhaft weiter steigt. Werden in der Regel mehr als 50 Bugs an den Bug Hunt Days gelöst, kann die Gesamtzahl der offenen Bugs auch wieder sinken. Doch nun genug der Zahlenspielereien.

Disclaimer 1: Traue keiner Statistik, die du nicht selber gefälscht hast.
Disclaimer 2: Mit Bugs sind in diesem Zusammenhang natürlich nicht nur Fehler in der Software gemeint, sondern auch Feature Requests, Fehler in der Doku und doppelte Meldungen.

Ich habe drei Theorien, weshalb es dieses Mal deutlich weniger Bugs waren, die bereinigt werden konnten.

  1. Wegen der drohenden Weihnachtszeit hatten die meisten Entwickler andere Sorgen als Bugs zu jagen.
  2. Bei den ersten Bug Hunt Days wurden bereits viele Bugs erfolgreich gefangen, die eher leichter zu fixen waren. Somit haben sich die meisten zuerst darauf gestürzt und nun sind nicht mehr so viele "leichte" Bugs übrig.
  3. Paddy war immer noch sauer wegen der Zend_Filter Geschichte und hatte dieses Mal keine Lust.

Habt ihr noch andere Theorien?


Better Tag Cloud