am 22. April 2010
Endlich ist es wieder soweit. Wir haben einen wunderbaren “What the Fuck?!” gefunden. Dieses mal im Zend Framework. Wir waren vor kurzem daran zu zeigen, wie schön einfach es sein kann einen RSS-Feed zu erstellen. Tja war wohl nichts. Wirklich kompliziert war es nicht, aber mir sind ein paar wirklich “fiese” Stellen untergekommen, die ich heute mal ansprechen möchte.
Prinzipiell kann man über Extensions einen RSS-Feed erweitern. Was ja eigentlich schön ist. Wenn ich also einen eigenen Namespace für phm haben will, dann schreibe ich mir eine phm-Extension. Diese registriere ich dann beim System. Dummerweise registriere ich die aber nicht bei einer Instanz eines Feed-Writers, sondern wirklich global im System. Jeder RSS-Feed, den ich danach erstelle wird diese Erweiterung auch beinhalten. Zumindest bis ich global den Reset-Knopf drücke. Finde ich schrecklich, weil man keine Ahnung hat,w elche Extensions jetzt wirklich schon registriert sind. Also werde ich natürlich am Anfang ein Reset drücken … und das jedes mal.
Zend_Feed_Writer::registerExtension( 'PhmRss' );
So, das war der erste Punkt, den ich anders machen würde. Merken wir uns: Global ist böse. Machen wir weiter., zwei Punkte habe ich nämlich noch. Der Zend_Writer hat beim initialisieren schon einige Core-Extensions dabei, die mit dem Reset autormatisch hinzugefügt werden. Ist ja nicht schlimm. Kann ja sein, dass es Extensions gibt, die “lebenswichtig” sind. Aber warum zum Teufel wird IMMER die iTunes-Erweiterung hinzugefügt? Und jetzt bitte nicht mit “das hat historische Gründe” kommen. Es sind übrigens noch mehr sinnfreie Standarderweiterungen dabei.
Aller guten Dinge sind doch drei, also brauchen wir auch noch einen dritten Punkt. Kein Problem, den liefert das System von selbst. Wir waren ja gerade bei der iTunes-Implementierung. Nehmen wir an, ich baue eine Erweiterung für phphatesme. Kann ja mal vorkommen. Diese soll das Element “phm:Duration” hinzufügen und füllen. Die Methode bei meiner Externsion heißt dann setPhmRssDuration(). Das dumme daran ist, wenn ich die Methode so nenne, dann wird mir autormatisch das iTunes-Feld Duration auch gefüllt. Warum das? jede Methode wird auf alle registrierten Erweiterungen aufgerufen, deswegen haben sie auch alle eine magische __call Methode, die halt nichts macht, wenn die nötige Methode nicht existiert. Die iTunes-Erweiterung prüft nämlich ob Name der Methode, die aufgerufen wir existiert, indem es die ersten 9 Zeichen abschneidet, ein setItunes oder addItunes davorstellt und ein method_exists aufruft. Tja dummerweise trifft das auf meine setPhmRssDuration() auch zu und somit wird das Feld Duration gefüllt. Dummerweise habe ich dann das itunes:duration Feld im Feed auch mit drinnen. (Wie das genau funktioniert, müsste ich mir aber nich mal angucken, war nur grad so schön um Fluss)
Ach tut das gut sich mal wieder aufzuregen. Ansonsten ist das Zend_Writer System schon ganz nett zu nutzen und an vielen Stellen gut durchdacht. Ich werde die Tage wohl einfach mal erklären, wie man eigene Extensions schreibt, denn dazu habe ich keine gute Doku gefunden.