Hallo Melvin,
was du da zeigst, ist eine generelle Worker-Klasse für bestimmte String-Aufgaben.
Bei MVC geht es aber nicht um Patterns zum Erledigen von Detailaufgaben, sondern um ein grundsätzliches Architekturpattern für Anwendungen. Web-Anwendungen sind ein Einsatzzweck.
MVC - Model - View - Controller.
Du hast ein Datenmodell, das die Daten repräsentiert, mit denen die Anwendung zu arbeiten hat. In einer Web-Anwendung sind das die Daten für einen Web Request.
Du hast Views, die die Daten präsentieren. Was ein View ist, hängt von der verwendeten Plattform und Programmiersprache ab. Der View kümmert sich um die Präsentation. In PHP kann das ein Template sein. Das Template kann direkt auf das Modell zugreifen, oder man generiert vor der Übergabe an's Template erstmal eine Zwischenschicht, die die Präsentationsdaten aus dem Modell ableitet: Das View Model. Das Template kann auch in JavaScript laufen und die PHP Schicht generiert nur as View Model und schickt es als JSON-String zum Browser. Das MVC Pattern legt das nicht fest. Es verlangt nur, dass die Präsentation von der eigentlichen Datenverarbeitung getrennt wird.
Du hast Controller, die die Verarbeitung steuern. Ein Controller kennt typischerweise eine oder mehrere Aktionen, und jede Benutzeraktion löst in einem Controller eine Aktion aus. Es ist üblich, dass ein Controller eine Klasse ist und eine Aktion eine Methode darin. Werden die Methoden zu groß, oder gibt es Teile die gemeinsam genutzt werden können, ist es durchaus zulässig, Subcontroller zu verwenden. Die eine Controller-Aktion, die durch die Benutzeraktion erzeugt wurde, orchestriert dann nur das Konzert der Subcontroller. Das Ergebnis einer Aktion ist immer ein View, der dem Anwender präsentiert wird - oder die Manipulation des aktiven Views (bei einer Single Page Application in Browser bzw. einer klassichen App).
Du wirst Dinge in dieser Liste vermissen.
-
Wo ist die Fachlogik? MVC legt das nicht fest. Es gibt MVC-Frameworks, die es festlegen. Aber grundsätzlich kann sie im Modell stecken, sie kann im Controller stecken, oder man schiebt eine Business-Schicht zwischen Controller und Model.
-
Wie binde ich die Datenbank an? Das macht im einfachsten Fall der Controller. Besser ist es aber, ein fachliches Domänen-Modell zu konzipieren und für jede Fachdomäne ein sogenanntes Repository zu erzeugen. Das ist eine Klasse, in der alle Zugriffe für diese Fachdomäne programmiert werden. Z.B. ein UserRepository (für Login und Benutzereinstellungen), ein LobbyRepository (für die Daten der Lobby eines Spielservers), ein MessageRepository (für die Threads und Postings eines Forums). Ein Repository kümmert sich um das Caching von geladenen Objekten, um das Zurückschreiben geänderter Objekte in die DB, und enthält alle Zugriffe. Oft genug kann man statt des Repository auch eine ORM (object-relation mapping) Library nutzen.
-
Wie bekomme ich die Daten eines Web-Requests in Objekte und wie plausibilisiere ich sie? Um Teil 1 kümmert sich ein MVC Framework. Hast Du keins, muss es der Controller machen. Teil 2 kann teilweise vom Framework gemacht werden, oder der Controller. Auch hier gilt: Subcontroller erleichtern die Arbeit. Ein Subcontroller kann einen Request parsen, plausibilisieren und dann Modellobjekte liefern. Oder einen Error View. Oder ein Flag, das den Hauptcontroller zum Generieren des Error View bewegt.
-
Woher weiß ich, welcher Controller und welche Aktion auf Grund eines Webrequests auszuführen sind? Das macht das MVC Framework. In einer Web-Anwendung nach MVC definierst Du ein Requestrouting. Das sind Patterns, gegen die die URL gematcht wird. Ein Beispiel wäre
www.example.org/users/edit/4711
. Diese URL spricht den User-Controller an und die Edit-Aktion. 4711 ist die Objekt-ID, auf die sich der Request bezieht. Sowas kann man im Apache mit mod_rewrite auf myapp.php?ctrl=users&action=edit&id=4711 mappen, oder man sagt dem Apache, dass er bei solchen URLs nicht nur nach einem Ordner users, sondern auch nach einer users.php suchen soll, und die startet dann den Router an. Andere Webserver (z.B. der IIS unter Windows) gestatten Dir auch das Schreiben sogenannter HTTP Handler, die aktiv werden bevor der Server nach einer statischen Ressource sucht. Der HTTP Handler bekommt dann einfach die URL und kann draus machen was er will. ASP.NET MVC macht das zum Beispiel.
Rolf
sumpsi - posui - obstruxi