Zend_Model – Stand der Dinge
Durch das Schreiben an dem Zend Framework Buch beschäftige ich mich derzeit auch mit der Frage nach einer Zend_Model Komponente. Wie erklärt man das Model-View-Controller Entwurfsmuster, wenn es für den Model-Teil im Zend Framework gar keine fertige Implementation gibt? Bereits vor über zwei Jahren war ich schon auf der Suche nach einer Zend_Model Komponente, doch bis heute scheint sich in Sachen Zend_Model nicht viel getan zu haben.
Generell besteht das Problem, dass oft fälscherlicherweise folgende Gleichung aufgestellt wird:
Model === Datenbank
Richtiger ist eher folgende Gleichung:
Model !== Datenbank
Das bedeutet, dass man das Model nicht mit der Datenbank gleichsetzen sollte. Das Model muss seine Daten nicht zwingend aus einer Datenbank lesen bzw. dort speichern. Gerade in der heutigen Web 2.0 Welt wird viel mit Webservices gearbeitet. Ein Model kann seine Daten auch aus einem Webservice beziehen bzw. auch Daten zur dauerhaften Speicherung an einen Webservice senden, wenn dessen API dies zulässt (Beispiel Zend_Gdata_YouTube). Zu guter Letzt gibt es auch noch das gute alte Dateisystem, in dem Daten in Form einer CSV, INI oder XML Datei vorliegen können. Alle diese Quellen, also Datenbank, Webservice und Dateien, können für ein Model als Datenquelle verwendet werden.
Die Philosophie des Zend Framework Entwicklerteams in Sachen Models ist die, dass die Implementierung des Model-Teils einer MVC Anwendung so vielfältig wie komplex sein kann, dass es dem Entwickler obliegt, diesen Part selber zu implementieren. Leider sind gerade Einsteiger, die auf der Suche nach dem “M” beim MVC sind, ein wenig überfordert, da für sie das Model so nicht wirklich greifbar ist. Deshalb gibt es Überlegungen, das Manual mit einem Kapitel über Zend_Model auszustatten, auch wenn es dafür keine Komponente gibt. Hierzu empfehle ich die Lektüre der etwas älteren Diskussion in Bill Karwins Blog zum Thema. Schauen wir einmal, was die Zukunft bringt.
Daneben gibt es auch ein Proposal für eine Implementation eines Zend_Model, die nach Stand der Dinge wohl im Wesentlichen aus einer Reihe von Interfaces bestehen wird. Das Proposal ist mit einigen Links zu anderen Quellen versehen und auch die Diskussion erscheint mir sehr interessant. Entschieden scheint aber noch nichts zu sein, also könnt ihr euch da gerne einbringen.
Wie es mit Zend_Model weiter geht, lässt sich momentan schwer sagen. Wird es die geplanten Interfaces gebe? Oder eher eine abstrakte Klasse? oder mehrere? Oder doch nur eine ausführliche Erläuterung im Manual, wie man als Entwickler seine Models am besten implementiert?
Bis dahin muss ich mir überlegen, wie ich die Problematik in meinem Buch am besten für die Einsteiger erkläre, damit nach der Lektüre nicht mehr Fragen offen bleiben, als es vorher schon gab… ;-)


Sonntag, 21.09.2008, um 18:25
Hallo,
ich habe mir eine Basis Modelklasse gebaut, die im Model Helper und Plugins ermöglicht. Davon abgeleitet gibt es Model_Table und Model_Select. Die erste hat eine Zend_Db_Table (HAS_A, nicht IS_A!), die andere ein Zend_Db_Select-Objekt als Membervariablen. Aber natürlich sind beide Klassen datenbankfokussiert. Besse wäre es, das Ganze über Adapter zu realisieren.
Also: die Model-Basisklasse ermöglicht zunächst nur eine komfortable Integration in das Framework, z.B. indem es das Laden von Plugins und den Zugang zu Helpern ermöglicht. Die Persistenz kann über einen Adapter bedarfsgerecht dazu geladen werden. Das wäre für mich gute Model-Konzept für das ZF.
Sonntag, 21.09.2008, um 21:31
Hallo Axel,
klingt auf jeden Fall sehr interessant. Mit ein wenig Code könnte man das natürlich etwas besser beurteilen.
Ich bin selber schon gespannt, wie die Zend Framework das Problem im Rahmen des Manuals lösen werden. Für mich selber muss ich das Kapitel über Models wohl doch noch erweitern und genauer ausformulieren.
Danke und Gruss,
Ralf
Montag, 22.09.2008, um 08:11
Weiters ist es möglich mit solchen von der Datenbank unabhängigen Models Unit-Tests zu schreiben – die nicht auf eine Datenbank angewiesen sind!
Problem bei den Models ist jedoch, dass die Db-Relationen nur schwer damit abgebildet werden können.
Niko
Montag, 22.09.2008, um 08:56
Hallo Niko,
ich habe nun schon von einem Ansatz gelesen (finde ich gerade nicht mehr), dass man die Relationen eher in den Models abbilden sollte und nicht in den Klassen, die von Zend_Db_Table abgeleitet werden. Das heisst, du hast für jede deiner Tabelle ein Objekt, das von Zend_Db_Table abgeleitet wird, und lässt dabei das Relationen-Feature von Zend_Db_Table einfach ausser Acht. In deinem Model baust du dann diese Verknüpfungen zwischen den einzelnen Tabellen auf. Deshalb finde ich die Unterscheidung von Axel zwischen Model_Table und Model_Select so interessant. Bei einem Objekt vom Typ Model_Select kannst du die DB-Relationen einfach über entsprechende Zend_Db_Select Aufrufe nachbauen. Und bei einem Objekt vom Model_Table kannst du dann ebenfalls auf die Relationen achten. Beispiel: du legst einen neuen Artikel in Tabelle articles an und legst dann zusätzliche den Eintrag in Tabelle articles_users an, mit dem du den Artikel mit dem Benutzer verknüpft.
Das sind aber alles nur meine spontanen wirren Gedanken, über die ich nochmal gründlich nachdenken möchte. Weiterer Input ist gerne willkommen.
Danke und Gruss,
Ralf
Montag, 22.09.2008, um 09:46
Hallo Ralf,
Genau das war auch mein Plan. Allerdings ist es erstens schade die Zend_Db_Table Relationen (funktionierender, getesteter Code) nicht verwenden zu können, und zweitens ist es relativ viel aufwand.
Eine eigene Select-Klasse haben wir bereits – die allerdings nicht recht viel kann.
Es würde absolut sinn machen solche Models in ZF verfügbar zu haben – nicht nur Interfaces sondern mit konkreten Implementationen für Db, Webservice, Ini, Csv etc.
Ein weiteres sehr nützliches Model haben wir auch noch: und zwar kann man mit diesem Model eine Row serialisiert in ein anderes Model speichern. Somit kann in einem Datenbank-Feld eine ganze reihe von Werten abgelegt werden ohne immer Felder dafür anlegen zu müssen. Und man kann ganz normal wie mit jedem anderen Model damit arbeiten.
Niko
Dienstag, 23.09.2008, um 08:26
Hallo Niko,
ich bin auch gespannt und habe Hoffnung, dass diese Thematik in Zukunft mehr angegangen wird. Bis dahin würde es wahrscheinlich helfen, möglichst viel Input in dem oben verlinkten Proposal zu geben, damit das ZF Kernteam sieht, dass das Thema sehr wichtig für die Community ist. Übrigens wurde vor kurzem das offizielle Quick Start Tutorial überarbeitet und dort findet man schon einen ersten Versuch, Model und Datenbank zu trennen. Dazu werde ich gleich noch einen eigenen Beitrag schreiben.
Den Ansatz mit dem serialisierten Array in einem Textfeld verwende ich schon länger für kleinere Dinge. Aber gerade in einem neuen Projekt setze ich dies konsequenter ein. Das macht einen ziemlich schlanken Fuss wie ich finde. :-)
Gruss,
Ralf
Dienstag, 23.09.2008, um 08:39
[...] Zend_Model – Stand der Dinge [...]
Samstag, 27.09.2008, um 10:27
[...] Zend_Model – Stand der Dinge [...]
Dienstag, 09.12.2008, um 21:14
[...] Ralf Eggert Ich habe vor einiger Zeit einmal über die nicht vorhandene Komponente Zend_Model geschrieben und dort den Stand der Dinge aus meiner Sicht zusammen gefasst. Das Kapitel zum Thema [...]
Sonntag, 11.01.2009, um 14:06
[...] Raplf Eggert: Zend_Model – Stand der Dinge [...]
Freitag, 25.09.2009, um 11:51
[...] 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 [...]