# MVC - Model!?



## Mik3e (8. Februar 2008)

Hi zusammen,

Habe mir gerade anhand einiger Tuts ein kleines MVC gestrikt. Ist sehr schlank, läuft aber 1A.

Nachdem ich mich erst seit ein paar Tagen intensiver mit MVC Patterns beschäftige:
Was hat es mit den verdammten Models auf sich? Ich habe gelesen und gelesen und überall stand was anderes.

Ich habe es so verstanden, dass in den Models eigentlich die Abfragen externen Datenquellen gekapselt werden.

Hier ein Verständnisbeispiel (nach meiner Methode) anhand eines klassischen User-Logins:

*Controller: User -> Methode: Login*
Controller prüft die vom User eingegebenen Daten und übergibt Username & Passwort an das Model.

*Model: User -> getLogin*
Prüft Username und Passwort gegen die Datenbank und retourniert (in diesem Fall) true / false. Je nach Ergebnis bringt der Controller dann eine Fehlermeldung (View) oder führt das Login aus.

Soviel mal zu meinem Verständnis. Aber ich habe auch schon anderswo gelesen, dass die Entwickler die Grenzen zwischen Controller / Model sehr aufweichen und teilweise gar keine Models verwenden sondern die Abfragen direkt in den Controller integrieren.

Würde mich freuen, wenn sich hier jemand findet der auch auf die MVC Pattern setzt und mir mal seine Erfahrung sagen kann.

Danke & Ciao,
Mike


----------



## caramba12321 (21. Februar 2008)

Genau die gleiche Frage habe ich auch(um den Thread mal wieder auszubuddeln).


----------



## jrook (21. Februar 2008)

Hallo Mik3e,

eine gute und kurze Erklärung findest Du hier:
http://de.wikipedia.org/wiki/Model_View_Controller

Viele Grüße
jrook


----------



## R00Ki3 (21. Februar 2008)

Ich würde es grundsätzlich trennen.
Es ist beides für sich übersichtlicher!
Es kann das eine verändert werden ohne das andere zu kontaktieren.
Es heißt Ja MVC und nicht VC.


----------



## caramba12321 (21. Februar 2008)

Wikipedia habe ich selbstverständlich schon gelesen:


> * Modell (model)  [Bearbeiten]*
> 
> Das Modell enthält die darzustellenden Daten und ggf. (abhängig von der Implementation des MVC-Patterns) auch die Geschäftslogik. Da das MVC-Pattern in verschiedenen Programmiersprachen unterschiedlich realisiert werden muss, trifft das MVC-Architekturmuster keine detaillierte Aussage über die Positionierung der Geschäftslogik innerhalb der MVC-Klassen. Diese kann je nach Anwendungsfall besser im Controller aufgehoben sein oder besser in das Modell verlagert werden. In der Praxis finden sich unterschiedliche MVC-Frameworks: Einige schreiben strikt vor, wohin die Geschäftslogik gehört, andere überlassen diese Entscheidung dem Softwarearchitekten.
> Das Modell ist von Präsentation und Steuerung unabhängig. Änderungen an relevanten Daten im Modell werden durch das Entwurfsmuster „Beobachter“ bekannt gemacht.
> quelle: wikipedia.de



aber  ehrlich gesagt verstehe ich das nicht, kann jemand vielleicht mal mit eigenen Worten erklären was das model genau macht? am besten auch das view und der controller, danke.


----------



## soyo (21. Februar 2008)

Interessiere mich nun auch schon eine Weile für das MVC-Pattern. Wie es funktionieren soll weiß ich, leider hapert es an der Umsetzung. 
Hat jemand ein kleines Beispiel wie sowas aussehen könnte? Finde leider nur Tutoriale im Zusammenhan mit XML


----------



## caramba12321 (21. Februar 2008)

wenn du weisst wie es funktionierst, könntest du es mir eventuell erklären?^^
hätte auch ein tutorial für dich, funktioniert aber nur mit php5.x da es  SPL nutzt:
http://www.phpit.net/article/simple-mvc-php5/


----------



## cyb3rdragon (21. Februar 2008)

So wie ich die MVC-Architektur verstanden hab ist das Model sowas wie das Arbeitstier und der Controller eine Verbindung zwischen Model und View. Außerdem sind im Model die daten gespeichert damit alle andern Objekte auf die gleichen zentral gelagerten Daten zugreifen können.

Um das Beispiel mit dem Login wieder aufzufassen wird der Login im Controller gestartet. 

Der _Controller_ gibt den Benutzer und das Passwort zum _Model_.
*Controller --> Model*
Das _Model_ prüft die Daten und gibt dann entweder die antwort das was nicht stimmt oder das alles passt. 
*Model --> Controller*
Abängig von der Antwort Steuert der _Controller _dann wieder die _View _und ruft entweder eine Fehlermeldung oder die Arbeitsfläche (oder was auch immer nach dem Login kommen soll) auf.
*Controller --> View*

Meiner Erfahrung nach werden dabei auch gerne mehrere Views benutzt womit das System dann wirklich seine Vorteile bekommt und es enorm erleichtert wird verschiedene Objekte auf der Oberfläche zu "synchronisieren".


----------



## soyo (22. Februar 2008)

Also könnte ich theoretisch meine Datenbank-Klasse, als Model verwenden? Um sehr mehr ich davon lese, um so mehr verwirrt mich das. Ich sehe auch keinen direkten Vorteil, da ich eh fast alles in Klassen schreibe. 
Vielleicht nutze ich schon ein MVC und weiß es nur nicht ^^


----------



## Gumbo (22. Februar 2008)

Ein typisches Beispiel für die Nutzung des MVC-Entwurfmusters in einer Desktop-Anwendung: eine Tabellenkalkulation.
Bei einer Tabellenkalkulation entsprechen die Daten in der Tabelle dem _Model_. Die Darstellung der Daten als Tabelle ist dabei bereits selbst ein _View_, also eine Darstellungsform der Daten. Wenn die Daten zusätzlich als Diagramm dargestellt werden können, beispielsweise ein Balken- oder Tortendiagramm, wären dies weitere Views. Alle Views registrieren sich dabei beim Model als Observer. Wenn nun die Daten in einem der Views verändert werden, teilen sie dies dem Model mit, das wiederum allen registrierten Views die Nachricht übermittelt, dass sich die Daten geändert haben, um die aktualisierten Daten vom Model anzufordern und sich selbst zu aktualisieren.
Der _Controller_ fungiert dabei als Schnittstelle für Benutzereingaben.

Um das Ganze auf das Login-Beispiel zu übertragen:
_Model_?Das Objekt Benutzer oder Benutzerverwaltung.
_View_?Login-Formular, Login-Statusmeldungen (Login erfolgreich, Login fehlgeschlagen, etc.)
_Controller_?Anwendungslogik, die die Benutzereingaben prüft und dementsprechend reagiert.
Eine Datenbankklasse ist in diesem Entwurfsmuster nicht vorgesehen sondern wäre ein Helfer der Benutzer- oder Benutzerverwaltungsklasse.


----------



## caramba12321 (22. Februar 2008)

ahh danke gumbo, das war nun wirklich hilfreich


----------



## Mik3e (25. Februar 2008)

@Gumbo:
Ganz verstehe ich das nicht.. Nach Deiner Logik würde ja die View (bei einer Zustandsänderung, d.h. zB. Submit eines Benutzers) die Daten direkt an das Model übermitteln, was in PHP ja prinzipiell nicht möglich ist (wenn ich Ajax hier mal ausschließe).

Damit die Zustandsänderung überhaupt greifen kann, muss ja ein POST oder GET über einen neuen Seitenaufruf geschehen, was wiederum den Controller zur Mitarbeit verpflichtet.

Verstehe ich das also richtig, dass die View mit dem Model ausschließlich über den Controller kommunizieren kann. Gilt natürlich nur für serverbasierte Sprachen...

Ciao,
Mike


----------



## Layna (25. Februar 2008)

Zum Thema aufweichen des MVC: zwar aus der Java-Welt, aber eventuell das weswegen dieses Topic eröffnet wurde:



> Modifizierte MVC-Architektur für Swing
> 
> Das MVC-Konzept trennt ganz klar die Bereiche ab, führt aber bei praktischer Realisierung zu zwei Problemen. Das erste betrifft die Entwickler der Komponenten. Meistens sind View und Controller eng verbunden, sodass es zusätzlichen Schnittstellenaufwand für die Implementierung gibt. Implementieren wir etwa eine Textkomponente, müsste sich diese um alle Eingaben kümmern und diese dann an die Darstellung weiterleiten. Das zweite sich daraus ergebende Problem ist der erhöhte Kommunikationsaufwand zwischen den Objekten. Wenn sich Ergebnisse in der Darstellung oder dem Modell ergeben, führt die Benachrichtigung immer über den Controller.
> 
> Es macht demnach Sinn, VC zu einer Komponente zu verschmelzen um die komplexe Interaktion zwischen View und Controller zu vereinfachen. Genauso haben es die Entwickler der JFC daher gemacht. In Swing findet sich keine Reinform des MVC, sondern eine Verquickung von View und Controller. Durch diese Vereinfachung lassen sich die Benutzeroberflächen leichter programmieren, wobei wir nur wenig Flexibilität einbüßen. Das neue Modell wird anstatt MVC auch Model-View-Presenter (MVP-Pattern) genannt. Betrachten wir das MVP-Konzept am Beispiel einer Tabellenkalkulation. Die Daten in einem Arbeitsblatt entsprechen den Daten, die unterschiedlich visualisiert werden können; klassisch in einem Tabellenblatt und modisch in einem Diagramm. Ein Modell kann problemlos mehrere Sichten haben. Eine Änderung der Daten im Tabellenblatt führt nun zu einer Änderung in den internen Daten und umgekehrt führen diese zu einer Änderung des Diagramms.



direkt aus: http://www-sst.informatik.tu-cottbus.de/~db/doc/Java/GalileoComputing-JavaInsel/java-16.htm


----------



## Gumbo (25. Februar 2008)

Das klassische MVC-Entwurftsmuster lässt sich nicht direkt auf Webanwendungen übertragen.


----------



## Mik3e (25. Februar 2008)

@Layna:
Nein, das war eigentlich nicht der Grund, sondern vielmehr die Verschmelzung / Trennung von Model und Controller.

Ich habe mir selbst ein MVC Framework auf basis von http://www.phpit.net/article/simple-mvc-php5/ gestrickt. In diesem Tutorial wird das Model zum Beispiel gar nicht implementiert sondern diese Funktion gleich im Controller abgefrühstückt.

Das Mischen von Controller und View kann ich mir überhaupt nicht vorstellen. Der Controller nimmt ja die Requests und Actions entgegen, und kümmert sich um die Steuerung (wie der Name schon sagt). Die View ist ja der reine Output an den User (und wird je nach Aktion geladen). Wie man diese zwei mischen soll ist mir überhaupt nicht klar...

Ciao,
Mike


----------



## lay-z-cow (25. Februar 2008)

Hi,
nur als kleine Ergänzung:
Das Model nicht mit dem Controller zu vermischen, macht z.B. Sinn, weil man dann die selben Informationen mit den gleichen Queries auf verschiedene Arten ausgeben kann: Bspw. als HTML und RSS.

Die View ist allerdings nicht nur Output, sondern auch Input, da der User ja Daten per Formular etc. eingeben kann.

Gruß

.:lay-z-cow:.


----------



## Mik3e (25. Februar 2008)

Das sehe ich genauso... Mischt man Controller und View, würde das ja keinen Sinn machen. Da lasse ich mir noch eher das Mischen von Controller und Model einreden.


----------



## jrook (26. Februar 2008)

Na ja, Du könntest Controller und view mischen, indem Du in deinem Template verschiedenen Usern verschiedene Inhalte anzeigst. 


```
{if $usr->accessgroup=="admin}
  <table.....userliste>
{else}
  Sie haben nicht die erforderliche Berechtigung
{/if}
```

Ich habe nie behauptet, dass das Sinn macht und wehre mich vehement gegen jede Behauptung in dieser Richtung 

Defakto macht das den ganzen Ansatz kaputt.

Aber möglich ist's.

Viele Grüße
jrook


----------



## Mik3e (26. Februar 2008)

Klar, man könnte auch alle drei teile mischen und "back to the roots" ala PHP3 arbeiten 
War ja auch kein Vorwurf, hat mich nur gewundert


----------



## soyo (7. März 2008)

Guten Morgen,

Ich hole den Thread mal etwas rauf, da ich noch einige Fragen haben. Ich habe nun eine Datenbank-Klasse, eine Template-Klasse und zum Beispiel eine Login-Klasse. Die Login-Klasse validiert die Benutzereingaben und prüft diese, über die Datenbank-Klasse. Über die Template-Klasse werden dann etwaige Fehler ausgegeben. Sollten alle Eingaben korrekt sein, leitet die Login-Klasse den Benutzer weiter. 
Arbeite ich also jetzt schon in Prinzp, mit einem MVC? 
Eventuell hat auch schon jemand ein deutsches (oder in einfachen englisch) geschriebenes Tutorial gefunden, was auf keinen Framework basiert?

Gruß Thomas


----------



## Mik3e (7. März 2008)

Hi,

Also mit MVC hat das noch nichts zu tun. Die eigentliche Logik (Pattern) von MVC (eigentlich MVC2) findest Du bei Wikipedia schön dargestellt. Und ein gutes (in einfachem Englisch gehaltenes) Tutorial findest Du weiter oben im Thread..

LG
Mike


----------



## Mik3e (18. März 2008)

Hi,

Ich muss dieses Thema nochmals hervorkramen.
Hat vielleicht jemand eine Idee / ein Pattern für die Usersteuerung bei MVC? Gibt es dafür auch spezielle Ansätze oder verwendet Ihr den herkömmlichen Weg über Sessions / DB Verification und header() redirect?

Ciao,
Mike


----------



## huzmaos (15. Mai 2008)

Ein deutschsprachiges Tutorial gibts hier: MVC mit PHP


----------

