![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Jonas Registriert seit: 03.06.2006
Beiträge: 239
|
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 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
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 | |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Basti | |
| | |
| | Nach oben #4 | |||
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
| 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 |
| Jonas Registriert seit: 03.06.2006
Beiträge: 239
|
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 | ||||||
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| 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 | |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
| 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 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
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 | |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
| 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 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
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 | |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
| 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: 279
|
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 |
| Christian Mühlroth 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: (So setze ich jedenfalls das MVCModell um
__________________ http://www.ChrisDiary.De |
| | |
| | Nach oben #14 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
hm... ich denke aber das jedes Modul einen eigenen Controller verdient hat oder nicht? Je nachdem wie du dein View/Model aufbaust, dürftest du auf Probleme stoßen, sobald du mehr als HTML ausgeben willst bzw mehr als nur via MySQL deine Daten speicherst. Allerdings ist Model/View wie von ex³ getan auch nicht sinnvoll, denn dein View/Model sollte nicht vom Modul abhängen, sondern von der Aufgabe. Hast du ein View_HTML z.B. dann können damit fast alle Module arbeiten. Mit dem Model das gleiche (Model_MySQL). Lediglich der Controller sollte einmal pro Modul existieren, da die Arbeitsweisen einfacher sind. Doppelt gemobbelter Post aber egal
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #15 | ||||||
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Weniger interessant, ob das nun MVC ist (dem ich auch widersprechen würde), sondern vielmehr, ob das sehr sinnvoll ist. Bei mir hat ein "Modul" in der Regel zumindest zwei Views (anzeigen und bearbeiten), weitere Views zum Hinzufügen, Auflisten aller Datensätze, Bestätigen vor dem Löschen etc. kommen da aber schnell noch dazu. Dazu greifen Controller mitunter auf Aspekte/Objekte des Modells zurück, die nicht explizit dem Modul zugeordnet werden können. Um beim Beispiel hier zu bleiben: In meinem CMS gibt es z.B. ein Modul, eine Seitenkomponente "Teaser", die beim veröffentlichen von neuen Seiten(-Versionen) News erzeugen kann. Sowohl das Teaser-Modul, als auch das News-Modul (das alle News darstellt) greifen auf das gleiche "Model" zurück. Ebenso die Navigarionselemente, die alle auf die "Sitemap" (sozusagen) zugreifen. Es gäbe sehr viele Redundanzen, wenn jedes Modul seine eigene Model-Klasse hätte. Zuerst hatte ich das auch so, aber das hat sich nicht bewährt. Und, was die Controller angeht: Natürlich brauchen diese verschiedene Views, mit denen sie arbeiten können. Klassisches Beispiel: Wenn Formular-Request valide, dann mach eine Weiterleitung zu der und der Sicht, andernfalls zeig das Formular nochmal an. Ist ja auch immer die Frage, was denn nun Controller genannt wird. In der Regel ist das in PHP-Anwendungen ja so eine Klasse in der alle Actions eines Moduls versammelt sind. Mitunter bekommt jede dieser Actions auch eine eigene Klasse oder Frameworks bieten beide Möglichkeiten an. Zitat:
Bis auf die Bezeichnung der Methode (und dass hier direkt SQL verwendet wird, anstatt sich die entsprechenden Objekte geben zu lassen) kann ich dem zustimmen. Bei mir siehts halt so aus: PHP-Code: Zitat:
Zitat:
Zitat:
Zitat:
|