![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Semantic Web Fanatic
Registriert seit: 03.06.2006
Beiträge: 237
|
Moin,
ich habe vor, mein Projekt auf Basis des MVC-Musters zu erstellen. Deshalb frage ich mich, ob ich das ganze auch richtig verstanden habe. Dazu habe ich dieses kleine Beispiel geschrieben. PHP-Code:
Habe ich das ganze richtig verstanden, oder müsste das ganze anders aussehen? Thx, Artemis
__________________
Applikations-Programmierung: BlitzMax, BlitzPlus Webentwicklung: PHP, (X)HTML, CSS, JavaScript, MySQL |
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 781
|
Hi.
Jo, so etwa kann man das machen. Ich hatte zuerst auch für jede Komponente (MVC-Einheit) je eine Model-Klasse definiert. Das ist aber quatsch, weil man ständig nur rumkopiert. Das Model ist das Datenmodell und es ist geschickt, wenn der Controller dieses direkt ansteuert. Also nicht eine "Model-Klasse", sondern eben alle Objekte, mit denen er arbeitet. (Siehe Beispiel unten) Dann finde ich es geschickt, wie z.B. bei Symfony die Daten den Views nicht per Parameter zugänglich zu machen, sonden, indem du sie als öffenliche Attribute in den Controllern definierst. In den Views kannst du dann über eine Methode (im einfachsten Fall __get()) direkt auf diese Werte zugreifen (die Methode kodiert diese ggf. um und den Aufruf kannst du z.B. über deine Template-Engine lösen, so dass der Template-Designer nichts davon mitbekommt). Dazu ist es natürlich nötig, dass die View seinen Controller kennt oder irgendwie drauf zugreifen kann. Mit Statischen Klassen ist da also nichts mehr. Weiter macht es Sinn, im Controller die View nur auszuwählen und diese Auswahl als Rückgabewert zurückzugeben. Mitunter willst du ja nichts anzeigen, sondern einen Redirect machen oder die Anfrage an eine andere Komponente weitergeben. Die Controller zeigen die Views also nicht an, sondern wählen diese nur aus. Und, weiter wirst du Komponenten auch in einem Baum organisieren wollen, so dass jede Komponente Unterkomponenten einbinden kann. Auch hierfür ist es eben wichtig, dass die Komponente ihre View nicht selbst ausgibt, denn eine Komponente "Page", deren Methode "edit" aufgerufen wurde, könnte z.B. mehrere Komponenten einbinden (z.B. PageImage, Text, Attachments) und kann dann ja erst nach Abarbeitung der letzten Unterkomponente feststellen, dass der Benutzer alles korrekt eingegeben hat. Hier wird sie also einen Redirect machen, andernfalls die Komponenten nochmal anzeigen, um das Formular korrigieren zu können. Beispiel: PHP-Code:
Eigentlich reicht auch ein Template als View. Eine Klasse würde ich dann verwenden, wenn hier nochmal bestimmte Daten aus dem oder zusammengetragen oder umgeschrieben weden sollen. Der einzige Zweck läge dann darin, das Template abzuspecken und dem Template-Designer bestimmte Flags etc. zur Verfügung zu stellen. Natürlich kann dann in so einer View-Klasse z.B.die display-Methode überschrieben werden, so dass garkein Tempalte eingebunden wird, sondern die Daten irgendwie anders ausgegeben werden. Basti Geändert von Basti (03.11.2006 um 15:34 Uhr). |
|
|
|
|
|
Nach oben #3 | |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 781
|
Zitat:
Basti |
|
|
|
|
|
|
Nach oben #4 | |||
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Zitat:
Sinn von MVC ist doch, dass View und Model sich nicht kennen und alles nur über den Controller passiert. Demzufolge darf es nur einen Weg geben: Der Controller holt sich Daten aus dem Model und gibt sie dem View. Zitat:
Zitat:
__________________
I did it my way - Senseless-Blog |
|||
|
|
|
|
|
Nach oben #5 |
|
Semantic Web Fanatic
Registriert seit: 03.06.2006
Beiträge: 237
|
Jo, ich denke auch das das so abläuft:
Controller holt sich die Daten aus dem Model, verarbeitet sie und gibt sie dann an den View weiter, welches alles ausgibt. Dafür müsste nur der Controller wissen, welches Model und welchen View er braucht.
__________________
Applikations-Programmierung: BlitzMax, BlitzPlus Webentwicklung: PHP, (X)HTML, CSS, JavaScript, MySQL |
|
|
|
|
|
Nach oben #6 | ||||||
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 781
|
Zitat:
Im PHP-Anwendungen ist diese Architektur natürlich quatsch, es sei denn, man speichert den Status (Viewstate), wie z.B. Prado in der Session. Ich frag mich halt nach einem tauglichen Weg. Denn einerseits finde ich es reizvoll, wenn die Controller den Views nicht alles "vorkauen" müssen (also alle Daten, die diese verwenden können zuvor bereitstellen), auf der anderen Seite ist das mitunter aber der einfachste Weg. Zitat:
Zitat:
Basti |
||||||
|
|
|
|
|
Nach oben #7 | |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Zitat:
Ich werde mal nach einer gescheiten "Anleitung" bzw Einführung ins MVC suchen und dann hier mal vorstellen und diskutieren. Mal wieder interessantes Thema
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
|
Nach oben #8 |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 781
|
Hi.
Ich denke, es ist in der PHP-Welt auch absolut üblich, es so zu machen, dass die Controller eben die Daten für die Views zusammenstellen. Zumindest Symphony, WACT, CAKE und andere machen es so. Ob die jeweils noch Mechanismen bieten, direkt auf das Model zuzugreifen, weiß ich nicht. Letztlich ist das ja auch in Ordnung bzw. tauglich und bieet den großen Vorteil, dass Template-Designer nur Zugriff auf Daten haben, die ihnen auch bereitgestellt werden (was natürlich auch wieder ein Nachteil sein kann, wenn ein Entwickler einbezogen werden muss, wenn der Designer da noch eine Info mehr reisetzen mag, die er sich eigentlich selbst aus dem Model ziehen könnte). Übrigens ist die Darstellung der Zeit in meinen Augen absolut die Aufgabe der View und nicht der Controller. Das Formatieren allgemein packe ich grundsätzlich in die View. Woher soll denn der Controller wissen, ob die Site nachher z.B. utf-8-codiert ist oder in latin 1? Basti |
|
|
|
|
|
Nach oben #9 | |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Zitat:
Also ich arbeite so, dass das View die Daten wirklich nur ausgibt. Aufbereitet werden sie über den Controller, denn nur der weiß, in welcher Lokalisierung er die Daten dem View zur Verfügung stellen soll. Sonst müsste die View ja viel mehr als nur Contentdaten noch vom Model beziehen. Und das würde in meinem Verständnis eher die Rolle des Controllers, der ja nicht nur Datenfluß sondern auch Datenart kontrollieren soll deutlich schmälern. Ich seh da halt nicht dieses Dreipunktekonstrukt sondern eher 3 Schichten in denen der Controller in der Mitte liegt.
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
|
Nach oben #10 |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 781
|
Das heißt aber auch, dass du für jede Kodierung je einen Controller brauchst. Das Ganze dann einmal für HTML, einmal für WAP und einmal für Atom oder so...
Ich denke als "Datenart" kann man auch z.B. einen i18n-String oder ein "l10n-Zeitstempel" verstehen. Ich weiß aber noch nicht, was da für mich am Geschicktesten ist. Ich verwende da im Moment eine arge Mischform und bin ständig am umbauen. Was den Punkt Schichten vs. Punkte angeht, so hat das mit der Thematik aber nichts zu tun. Hierbei geht es ja nur darum, woher die View die Daten bezieht, also ob (ausschließlich) vom Controller oder aus den Models. Der Punkt hier ist ja der, in wie weit die Controller die Daten für die View aufbereiten bzw. ob es die Aufgabe der Controller ist, diese überhaupt irgendwie aufzubereiten, anstatt sie einfach als blanke Datenobjekte zu übergeben. Mal weg davon, was MVC bzw. Model 2 bedeutet hin dazu, was taugt, würde ich die Verantwortung für die Darstellung trotzdem in jedem Fall in die View-Schicht packen. Das ist bei lokalisierten Datumsormaten für mich eindeutig, z.B. bei mehrsprachigen Texten wiederum nicht so ganz. Ein häufig erwähnter Punkt in dieser Diskussion ist ja z.B. die Sortierung von Listen oder das Aufteilen von Listen auf mehrere Seiten. Eigentlich ganz klar Aufgabe der View, aber prakisch eben mitunter ungünstig, das so umzusetzen. Zumindest, wenn die Controller die Daten zur Verfügung stellen müssten diese ja prinzipiell alle Daten (die komplette Liste) auslesen und das ist ja nicht vertretbar. Ganz gute Diskussion zur Entwicklung der MVC-Konfusion *g, aber sicher schon bekannt: http://c2.com/cgi/wiki?WhatsaControllerAnyway Basti |
|
|
|
|
|
Nach oben #11 | |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
Zitat:
View nimmt die Daten und füttert damit seine Templates oder was auch immer benutzt wird. Die Steuerung der View übernimmt aber auch der Controller, meiner Meinung nach. Aber da scheiden sich wahrscheinlich wieder die Geister Zum Link: zu lang für die Arbeit
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
|
Nach oben #12 |
|
Erfahrener Benutzer
Registriert seit: 30.10.2005
Beiträge: 274
|
Hallo ich hab selbst mal mit MVC rumprobiert, vielleicht könnt ihr euch mal dazu äußern. Ein News Bereich o. ä. ist nicht vielleicht nicht gerade ein Paradebeispiel, aber schaut euch das mal an und kommentiert was dazu.
Dann wäre nochwas Wie bringt man in diesem Konzept denn ein error handling mit exception am geschicktesten unter? und ist es wirklich nötig Funktionen,etc. statisch zu machen oder mit Referenzen zu arbeiten also :: oder &= Ich denk doch mit PHP5 ist das doch egal oder PHP-Code:
PHP-Code:
PHP-Code:
|
|
|
|
|
|
Nach oben #13 |
|
Erfahrener Benutzer
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
|
Grundsätzlich ist es beim MVCModell so, dass du ein View, ein Controller und ein Model hast. Hier mögen die Geister zwar schon ausseinandergehn, jedoch halt ich dies sehr sinnvoll. Die News von denen du sprichst, wäre dann ein "Modul". Du kannst soviele Module haben wie du möchtest und brauchst - es existiert dennnoch nur ein View, ein Model und ein Controller. Dein Modul macht dann z.B. folgendes: PHP-Code:
|