Hellihello
Beispiel: Oft wird z.B. eine Datenbankverbindung o.ä. als Singleton angelegt. Will man nun plötzlich mal seine Klassen dazu verwenden, um Daten von einer Datenbank in die andere zu kopieren, hat man ein Problem, weil man sie nicht mehr einfach zwei mal für verschiedene Datenbanken instanzieren kann.
Den Front-Controller aber kann es ja nur einmal geben. Dadurch wird er dann auch zu so einer Art Registrierung, weil alle Plugins sich dort eintragen.
Wieso nicht? Dann liegen die Queries im Model, die Ausgabe in der View und dazwischen, ganz schlank, ein paar Verdrahtungen.
Eben, die Queries liegen dann im Modell. Damit hast Du gleich zwei Probleme: Erstens kann es schwierig sein, die Queries sauber einzelnen Modellklassen zuzuordnen und wahrscheinlich werden viele Queries Information über Tabellen fremder Modellklassen benötigen. Damit änderst Du möglicherweise etwas an der Implementierung einer Modellklasse und zugehöriger Tabelle und stellst dann fest, dass Du auch noch andere Klassen ändern musst.
Weil denen dann Funktionen des Interfaces fehlen? Habe ich das Problem auch, wenn ich erst ein Iterface definiere und dann eine abstrakte Klasse als Implementierung, von der die anderen Model-Klassen erben?
Das zweite Problem ist: Du kannst nicht mehr so flexibel auf die Datenbank zugreifen,
Ob jetzt SQL-Datenbank oder XML oder serialized-data ist dabei wohl egeal, oder?
da Du nicht einfach mal schnell ein Query über mehrere Tabellen weg ausführen kannst, sondern nur mit den Operationen auskommen musst, die das Modell bietet. Man kann dann natürlich anfangen, komplexere Abfragemöglichkeiten in das Modell zu stecken, das vergrößert dann wieder das andere Problem.
Hier verstehe ich vermutlich erst, wenn mir das mal wirklich unter die Finger kommt. Eine Abfrage über Tabellen hinweg könnte doch von einer weitern Klasse realisiert werden, die dann auf die "Tabellen"-Klassen zugreift, dachte ich.
Um Objektorientierung und Datenbanken zusammenzubringen, gibt es Object-Relation-Mapper. Vielleicht bietet Zend auch etwas in dieser Richtung? Da kann man dann Queries auf Objektebene formulieren und SQL wird im Hintergrund automatisch erzeugt. Damit kann man dann auch gleich ganze Objektgraphen aus der Datenbank holen oder Objekte automatisch aus der Datenbank nachladen, wenn man sie braucht.
Zend bietet nur "V" und "C", kein "M". "model can be anything". Das deren "Philsophie", wenn ich das recht kapiere. Zumindest ist das ein sicher nicht unwesentlicher Unterschied zu RoR.
Die Implementierung von Interfaces und Nutzung abstrakter Klassen geht ja ohne OOP wohl auch nicht, oder?
Ja, aber wofür verwendest Du diese Dinge? Für Controller, View, Actions usw? Oder auch um die Daten abzubilden?
Was meint "Daten abbilden"? Ich hatte überlegt, ein Model-Interface zu definieren:
interface My_Model_Interface
{
function getForm();
function create();
function read();
function update();
function getList();
}
und dann eine abstrakte Klasse als Implementation.
<?php
abstract class My_Model_XML_Abstract implements My_Model_Interface
{
//~ private $_model = NULL;
// still missing:
private function _setData() {}
private function _getData() {}
function __construct($modelFileName)
{
$this->_model = My_Model_ModelReader::getModel($modelFileName);
}
public function getForm()
{
return new My_Model_FormCreator($this->_model);
}
// still missing:
public function create() {}
public function read() {}
public function update(){}
public function getList() {}
}
Dann würden die Controller über diese Schnittstelle auf Daten zugreifen und "wüssten" nicht, ob dabei das Model die Daten aus einer XML-Datenbank oder SQL-Datenbank oder einem serialisierten File holt.
Ich dachte, so würde man Modularität ermöglichen. Ich könnte das Model unabhängig von den Controllern ausbauen, ohne je bei den Controllern was änderen zu müssen.
Zeichnet sich Modulariät nich dadurch aus, dass man immer die Möglichkeit hat, weitere Schnittstellen anzubieten (zB. innerhalb des Models) um Spezialaufgaben an u.U. neue Klassen zu deligieren, _ohne_ die bereits vorhanden Klassen dadurch zu berührern?
Dank und Gruß,