PHP Sammelthread: Zend Framework und alles was dazugehört

Yii ist noch relativ jung.
Zf ist gerademal 2 Jahre final und der Erfolg spricht ja Bände, aber ich will niemanden überzeugen, muss ja jeder für sich selbst wissen.

Ein Grund, warum ich mich bisher gegen das ZendFramework etwas sträube.
diese Upgrade-Geschichte ist ein absoluter Irrglaube ;)

Das Buch kannst du mittlerweile fast in die Tonne hauen, weil es noch auf einer alten Framework-Version beruht und es gerade mit 1.8 teilweise große Änderungen gab.
seit 1.5 sind nur Komponenten hinzugekommen, es gab nur 1-2 Brüche der BackwardCompatibility.
Warum immerwieder gemeint wird, dass es nicht abwärtskompatibel ist, kommt daher, weil Komponenten erschaffen wurden, die eine Lücke von vorher füllten.
Zend_Application es gab vorher keinen standardisierten Ansatz fürs Bootstrapping, mit 1.8 kam einer.

Das ist das Hauptproblem vom ZendFramework finde ich. Such mal im Internet nach Tutorials oder Beispielen zum ZendFramework. Kannst du zu 99% alle vergessen, weil die mit der aktuellen Version nicht mehr kompatibel sind.
k, meine richtigen Versionen fingen erst mit 1.5 an, beobachten wir die Änderungen seit dem:
  • ZF 1.6: keine Brüche der BC, keine Komponenten die man einsetzen müsste/sollte, dafür einige nützliche Dinge.
  • ZF 1.7: Kein Bruch der BC, keine Komponenten auf die man umsteigen sollte, einige nützliche Dinge
  • ZF 1.8: Zend_Application als Umstieg fürs Bootstrapping (kein muss, aber oft der Grund warum man nicht mehr nach altem Bauen sollte), Zend_Loader BC-Bruch (3 Zeilen zum fixxen), einige neue Möglichkeiten (übersetzbare URLs :ugly:)
  • ZF 1.9: kein BC-Bruch, das "Enterprise-Release" (Message Queues), konnte ich nix wirklich brauchen, aber das ist ja unterschiedlich.

Und nicht nur, dass es bei Versionsprüngen wie 1.7 -> 1.8 (und zuvor auch des öfteren) zu einigen Inkompatibilitäten kommt
wie gezeigt, war es eine mögliche Verbesserung des Sourcecodes, man musste sie nicht machen ;)
Ich kenne einige die laufen noch mit nem Zf 1.0 App und ner 1.9er Library

steht ja scheinbar mit Version 2 das nächste Disaster bevor. Entweder du bleibst dann mit alten Projekten auf dem letzten Framework stehen oder du kannst große Teile deiner Projekte überarbeiten.
Was und inwieweit zum Zf 2.0 Änderungen stattfinden, weiß noch niemand ;)
Ich kann dir aber fast versichern, dass bis auf Namespaces keine rieeesen Änderungen kommen, man wird einige Komponenten nen bisschen ändern um Tickets aus dem Issue-Tracker lösen zu können, die momentan nicht umsetzbar sind, aber es wird sich nicht alles ändern ;)
Der Großteil des Codes steckt eh in den Controllern und Models, da wird wohl mit am wenigsten passieren.

Ich weiß nicht, in wie fern das noch aktuell Vergleichbar ist. Aber bei Performance-Vergleichen mit anderen Frameworks (leider auf Basis älterer Versionen) schneidet das ZF alles andere als gut ab.
das haben wir mehrmals im deutschen Zf-Forum besprochen, es gibt leider keinen einzigen repräsentativen Benchmark :(
 
Mag sein, dass ich das etwas zu eng sehe. Meine Erfahrungen mit PHP-Frameworks halten sich auch in Grenzen.
Ich habe aber auch bewusst provozierend das ZF schlecht dargestellt, da ich eben solche Aussagen wie deine hören wollte. ;)
Es heißt auch nicht, dass ich nicht doch beim ZF landen werde. Mal sehen, ich werde mir auf jeden Fall einen Teil der anderen Frameworks noch genauer ansehen.

das haben wir mehrmals im deutschen Zf-Forum besprochen, es gibt leider keinen einzigen repräsentativen Benchmark :(

Wäre vielleicht mal eine Idee, eine PHP-Framework-Benchmark-Suite zu entwickeln. Für JS gibt es sowas ja auch. :)
 
Och, du kannst gerne schlecht darüber berichten, da habe ich nichts dagegen, wenn die Fakten stimmen ;)

Du solltest dir auf jedenfall auch andere ansehen, nimm das, mit dem du möglicherweise am besten klarkommst.

PHP-Benchmarksuite, hmm, die Idee gabs schonmal, scheitert aber schon an der Komplexität der Systeme. Beim ZF hat man währen dem Dispatchen des Requests (URL umwandeln bis Controlleraufruf) sehr viele Hooks und Möglichkeiten es zu beeinflussen, weshalb natürlich ein simples "Hello World" langsamer als bei anderen läuft.
Ich konnte mich noch nie über die Performance beschweren, es gibt ne Handvoll Kniffe, womit das Zf relativ schnell wird (schlankere Systeme sind natürlich schneller, aber ich verzichte bei gutem Code gerne auf ein wenig Leistung).
 
Hey Leute schaut mal was ich feines gefunden habe, online Buch vielleicht kennt Ihr es ja schon. Ich wollte es nur mal weiter geben das Kapitel zu Optimierung ist recht spannend, ist im Anhang B zu finden.
 
Oh, danke, gibt anscheinend mehr her, als die Optimierung, die direkt im ZF-Manual steht, muss ich mich beizeiten mal durchwühlen :biggrin:

Btw: Du bist rar geworden :(
 
Ich weiß war in letzter Zeit nur am arbeiten und dann kam noch ein Umzug mit dazu, naja jetzt läuft es so langsam wieder normal. Ich les jetzt wieder mehr hier mit und mal schaun vielleicht mach ich mal wieder was mit dem ZF, such gerade nen Kalender evtl. einen den man mit dem ZF direkt nutzen kann. Kennt Ihr was.

Btw. nochmal zum Buch schaut auch mal das Zend_Application Kapitel an ;)
 
Hab mal wieder ne Frage ;)
Mir gefällt Zend_Db_Table/Select nicht so besonders gut, mir gefällt die schreibweise nicht und dass Standardmäßig ein SELECT * ausgeführt wird.
Soweit ich mich erinner, nutzt ice-breaker das ja auch nicht. Wie behandelt man das aber stattdessen am besten?
Mir fallen da zwei Möglichkeiten ein:

1. Im Konstruktor des Models holt man sich das DB Objekt aus der Registry (oder über nen Parameter?) und speichert ihn in nem Datenfeld. Dann schreibt man in den Methoden z.B. $this->db->fetchRow($query) und bekommt dann bei nem SELECT ein Ergebnis Array zurück.
2. Man macht das ähnlich wie bei 1., erweitert Zend_Db_Table und hat somit das Db-Objekt direkt in $this->getAdapter() zur Verfügung. Außerdem sind die Methoden für INSERT und UPDATE verfügbar (dort finde ich gar nicht so schlecht).

Wenn man sich also nicht auf Zend_Db_Table/Select verlässt, bekommt man ja auch kein Objekt von Zend_Db_Table_Row, aber brauche ich sowas? Bietet diese Klasse Methoden, die man brauchen könnte? Ich hab da beim überfliegen jedenfalls nichts gesehen.
 
2. Man macht das ähnlich wie bei 1., erweitert Zend_Db_Table und hat somit das Db-Objekt direkt in $this->getAdapter() zur Verfügung. Außerdem sind die Methoden für INSERT und UPDATE verfügbar (dort finde ich gar nicht so schlecht).
finde ich den von dir am besten Ansatz ;)
aber dann auch mit ner statischen setAdapter()-Methode in deiner Vater-Model-Klasse.

Wenn man sich also nicht auf Zend_Db_Table/Select verlässt, bekommt man ja auch kein Objekt von Zend_Db_Table_Row, aber brauche ich sowas? Bietet diese Klasse Methoden, die man brauchen könnte? Ich hab da beim überfliegen jedenfalls nichts gesehen.
also ich finde das was Zend_Db_Adapter_Abstract bietet mehr als ausreichend, gut für spezielle MySQL-Sachen nicht, aber das ist eine andere Sache.
 
finde ich den von dir am besten Ansatz ;)
Gibts noch bessere Ansätze? :)

aber dann auch mit ner statischen setAdapter()-Methode in deiner Vater-Model-Klasse.
Wie darf ich das mit dem Vater-Model verstehen? Soll ich ein eigenes Model erstellen, von dem alles abgeleitet wird, in dem der Adapter erstellt wird?
Ich hab das im Moment nämlich so in nem Front Controller Plugin:
PHP:
Zend_Db_Table_Abstract::setDefaultAdapter($db);

also ich finde das was Zend_Db_Adapter_Abstract bietet mehr als ausreichend, gut für spezielle MySQL-Sachen nicht, aber das ist eine andere Sache.
Jep, das habe ich auch schon gemerkt, aber man kann ja auch nicht jede kleine Funktion darin erwarten.
 
Gibts noch bessere Ansätze? :)
oh, wir haben da eine ewig lange Diskussion mit 3 oder 4 Nebendiskussionen geführt :biggrin:
:arrow: Zfforum: Towards Better Object Modeling -> konkrete Implementierung
:arrow: Mein Entwurf dazu

Ich denke, wenn man das sinnvoll umsetzt, hat man das non-plusultra, ich bin da aber auch noch immer am experimentieren :biggrin:


Wie darf ich das mit dem Vater-Model verstehen? Soll ich ein eigenes Model erstellen, von dem alles abgeleitet wird, in dem der Adapter erstellt wird?
Ich hab das im Moment nämlich so in nem Front Controller Plugin:
PHP:
Zend_Db_Table_Abstract::setDefaultAdapter($db);
PHP:
class Flaschenkind_Model {
  public static function setAdapter($adapter){ ... }
  protected static function getAdapter() { ... }
}

class Flaschenkind_Model_User extends Flaschenkind_Model { .... }
 
Zuletzt bearbeitet:
Thx für die Links, les ich später mal durch.

PHP:
class Flaschenkind_Model {
  public static function setAdapter($adapter){ ... }
  protected static function getAdapter() { ... }
}

class Flaschenkind_Model_User extends Flaschenkind_Model { .... }
Aber ist das nicht das gleiche, wie wenn ich das über Zend_Db_Table_Abstract::setAdapter mache? Ich erweitere bei dem Ansatz ja immer noch Zend_Db_Table
 
also ich sehe da kein Zend_Db_Table ;)

oder habe ich dich falsch verstanden und du willst irgendwie für irgendwas Zend_Db_Table nutzen?
 
2. Man macht das ähnlich wie bei 1., erweitert Zend_Db_Table und hat somit das Db-Objekt direkt in $this->getAdapter() zur Verfügung. Außerdem sind die Methoden für INSERT und UPDATE verfügbar (dort finde ich gar nicht so schlecht).

also ich sehe da kein Zend_Db_Table ;)

oder habe ich dich falsch verstanden und du willst irgendwie für irgendwas Zend_Db_Table nutzen?
Hatte ich in meiner 2. Möglichkeit geschrieben *g*
Man kann aber natürlich auch gänzlich drauf verzichten, da haste recht.
 
...
Wenn man sich also nicht auf Zend_Db_Table/Select verlässt, bekommt man ja auch kein Objekt von Zend_Db_Table_Row, aber brauche ich sowas? Bietet diese Klasse Methoden, die man brauchen könnte? Ich hab da beim überfliegen jedenfalls nichts gesehen.

Spontan fällt mir da der Paginator ein, swenn ich das noch von meinem letzten Teil richtig in Erinnerung habe, verwaltet der für dich dann das Select Object. Bin mir aber nimmer sicher, musst Du mal lesen fals Du das überhaupt nutzt.
 
Spontan fällt mir da der Paginator ein, swenn ich das noch von meinem letzten Teil richtig in Erinnerung habe, verwaltet der für dich dann das Select Object. Bin mir aber nimmer sicher, musst Du mal lesen fals Du das überhaupt nutzt.
Jedenfalls kann man den auch so benutzen. Hab ich nämlich so gemacht, wusste gar nicht, dass es mit nem Select Objekt geht *g*
 
Ich habe mir heute die Version 1.9.4 heruntergeladen und wollte den neuen baseUrl-Helper nutzen. Es wird aber nichts ausgegeben :roll:
Wenn ich mir die BaseUrl direkt über
PHP:
Zend_Controller_Front::getInstance()->getBaseUrl()
im Template ausgeben lasse, geht es. Ich habe dann mal im Code ein bisschen rumgeguckt, und festgestellt, dass die Abfrage (über diese Methode) im Helper nichts zurückgibt. Im Template, wie gesagt, schon.
Hat noch jemand dieses Verhalten :-?