© saicle/Shutterstock.com
Model View Controller in Webanwendungen

Was nicht passt, wird passend gemacht


Model View Controller ist eines der bekanntesten Entwurfsmuster. Allerdings ist es mit über dreißig Jahren deutlich älter als das World Wide Web. Wen wundert es da, wenn der Einsatz von MVC im Web das eine oder andere Fragezeichen aufwirft? Wir sehen einmal ganz genau hin.

In der letzten Ausgabe haben wir damit begonnen, einmal „hinter die Kulissen“ von MVC zu schauen. Der zentrale Nutzen von MVC ist „Separate Presentation“, also die Abtrennung der Präsentation von den anderen Belangen wie Logik oder gar Datenhaltung [1], [2]. Die Grundidee dabei ist es, Daten in einem so genannten Model zentral zu repräsentieren, damit verschiedene Ansichten (Views) auf diese Daten synchronisiert werden können. Ein klassisches Beispiel dafür sind Multiple Document-Interface-Applikationen. Sie ersparen es dem Benutzer, wiederholt zwischen zwei Fenstern hin und her zu blättern, denn er kann mehrere Fenster gleichzeitig öffnen. Damit das sinnvoll funktioniert, müssen die unterschiedlichen Views (GUI-Elemente) „automatisch“ jeweils dann aktualisiert werden, wenn sich das Model geändert hat. Hierbei kommt eine Subject-Observer-Beziehung zum Einsatz, die wir in der letzten Ausgabe bereits ausführlich diskutiert haben [3].

In dieser Ausgabe wollen wir uns mit MVC im Web beschäftigen. Bevor wir uns näher ansehen, wie das überhaupt funktionieren kann, sehen wir uns noch eine „echte“ MVC-Implementierung in PHP an. Wir stellen uns vor, dass unser Model einen Zähler repräsentiert und es zwei Buttons – also Views – gibt, die den Zähler inkrementieren. Jede View zeigt zudem den aktuellen Zählerstand an. Klickt man also auf einen der beiden Buttons, muss der Zähler im Model inkrementiert werden und sich daraufhin beide Views mit dem Model synchroniseren. Als gute Entwickler definieren wir im ersten Schritt die notwendigen Schnittstellen (Listing 1). In Listing 2 implementieren wir zuerst das Model.

Listing 1

interface Model { public function attach(View $view); } interface View { public function attach(Controller $controller); public function update(Model $model); } interface Controller { public function update(View $view); }

Listing 2

class MvcModel implements Model { private $views = array(); private $counter = 0; public function setCounter($counter) { $this->counter = $counter; $this->notify(); } public function getCounter() { return $this->counter; } public function attach(View $view) { $this->views[] = $view; } private function notify() { foreach ($this->views as $view) { $vie...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang