MVC: Besser Programmieren mit Design Pattern Model-View-Controller (MVC)

Definition: Design Pattern


Was ist ein Design Pattern / Entwurfsmuster?
Zitat eines Zitats aus dem Vortrag “Besser PHP programmieren mit Design Patterns” von Manuel Blechschmidt 2oo4: "Patterns sind Loesungsschema fuer Probleme, die in der objektorientierten Softwareentwicklung in verschiedenen Kontexten immer wieder auftreten."
Oder aus dem Schach: "Gefahr erkannt, Gefahr gebannt."
Definition: Model View Controller (MVC)
Struktur- + Richtlinien Pattern
Drei unabhaengige (austauschbare) Teile:

  • MODEL (Datenbank, Datei, Zuweisung, Dateisystem)

  • VIEW (XHTML+CSS, der View weis nicht, woher die Daten kommen)

  • CONTROLLER (kuemmert sich um Ereignisse und verarbeitet diese, schickt das Model Daten holen, ruft View auf um Daten zu formatieren + auszugeben)


Motivation zur Veraenderung


Motivation: Zunehmend schwer wartbarer Code beim Projekt LinkMatrix.de (Open Education)
Datenbank-Inhalte wie Artikel, Tags, TopListen mit + ohne Langtext, ein-, zwei- + vierspaltig ausgeben. Aufwendig, da viel Doppelarbeit, viele Design Fehler + schwer wartbar
Wie Abhilfe schaffen? Da war doch was...
Umstellung auf MVC-Architektur verspricht Abhilfe oder nicht? Lohnt der Aufwand?
Langfristige Ziele:

  • Schneller entwickeln

  • Code wiederverwenden

  • Design delegieren koennen (Arbeitsteilung)

  • Komplexitaet beherrschbar machen

  • Saubere Trennung des Codes in drei Schichten:


    1. Daten holen (Model)

    2. Daten formatieren (View)

    3. auf Ereignisse reagieren (Controller)





Jetzige Situation


Ursache: Code ist Mischmasch aus Daten holen (meist aus DB) und Daten anzeigen (HTML-Formatierung)
Nachteile:

  • Lange, unuebersichtliche Quelltexte

  • Kaum wiederverwendbar (mit Tricks wie Modus Schaltern wird es noch undurchschaubarer)

  • Viel Zeit fuer "sich wieder reindenken" verschwendet

  • Entwicklung wird komplexer



EVA-Prinzip als MVC-Analogie



  • Eingabe (M)

  • Verarbeitung (C)

  • Ausgabe (V)



Modus Schalter, die die Ausgabeart steuern, erhoehen die Komplexitaet.
Durch MVC-Architektur koennen schnell und einfach neue Seiten bebaut werden, man faengt an spielerisch ranzugehen, weils einfacher ist.

Moegliche Alternativen
Meist 2-Teilung im Code vorhanden: Controller (PHP-Engine) reagiert auf Events (Klick auf URL die Action-Parameter beinhaltet: www.example.de/index.php?action=top100
„Template“ das in Wahrheit Model + View vermengt (Daten holen + darstellen)

MVC-Vorteil



  • Saubere 3-Teilung, dadurch Models wiederverwendbar

  • Code kuerzer

  • uebersichtlicher

  • einfacher

  • stabiler

  • Arbeitsaufwand + Kosten sinken

  • Gewinn steigt




MVC: 3 independent layers


  • MVC: 1. Controller
  • MVC: 2. Model
  • MVC: 3. View

    MVC Beispiel


    Struktur der Verzeichnisse



    Root: www.linkmatrix.de
    Controller: www.linkmatrix.de/controller
    Models: www.linkmatrix.de/model
    Views: www.linkmatrix.de/view


    Einfaches Beispiel fuer die Seite download:
    Link: www.linkmatrix.de/index.php?education=download
    Controller: www.linkmatrix.de/controller/download.php
    Model: www.linkmatrix.de/model/download.php
    View: www.linkmatrix.de/view/download.php

    Der Dateiname download.php ist bewusst immer der gleiche in allen drei Verzeichnissen. Das vereinfacht das zuordnen und wiederfinden.

    Beispiele fuer Controller



    Beispiel: User klickt auf Link: www.linkmatrix.de/index.php?education=icons
    Klickt der User auf obigen Link, dann laedt die Datei index.php automatisch den Controller icons.php.
    In der Datei index.php veranlasst die Variable $_GET['education'] mit dem Inhalt icons den Controller icons.php zu laden, d.h.
    folgendes Kommando wird ausgefuehrt:
    include('controller/'.$_GET['education'].'.php')
    Weiteres Beispiel: www.linkmatrix.de/index.php?education=download --> Controller download.php wird geladen
    Weiteres Beispiel: www.linkmatrix.de/index.php?education=news --> Controller news.php wird geladen
    Weiteres Beispiel: www.linkmatrix.de/index.php?education=videos --> Controller videos.php wird geladen


    Beispiel fuer Controller videos.php:
    include('model/videos.php');
    include('view/videos.php');


    Beispiel fuer Controller download.php:
    include('model/download.php');
    $data = array();
    $data = download();
    include('view/download.php');


    Der Controller ruft das Model, holt die Daten, z.B. in einzelne Variablen, Index-Array, Array $data mit Schluessel-Werte Paare oder Daten im XML Format. Anschliessend ruft der Controller den View download.php aus dem Verzeichnis /view. Der View erwartet eine Variable $data, die in einer Schleife die Daten aus $data in HTML ausgibt.


    Einfaches Beispiele fuer Model model/download.php




    function download() {

    $data = array();

    $data[] = array('title'=>'Berlin', 'url'=>'photos/brandenburger-tor.jpg');
    $data[] = array('title'=>'London', 'url'=>'photos/tower-bridge.jpg');
    $data[] = array('title'=>'Paris', 'url'=>'photos/eiffel-turm.jpg');

    return $data;
    }




    Einfaches Beispiele fuer View view/download.php



    $out = '';
    echo $out;


    Der View erzeugt eine Liste mit drei Links auf drei Photos:

    • Berlin

    • London

    • Paris

    • Empfehlung




    Der View view/download.php kann fuer aehnliche Listen ohne Veraenderungen wiederverwendet werden. Ebenso das Model, wenn die Photos beispielsweise direkt ausgegeben werden sollen.

    Zusammenfassung



    • MVC Design Pattern moeglichst immer einsetzen, auch bei kleinen Projekten

    • Zeitersparnis bei neuen Seiten oder Funktionen durch Wiederverwendung eines Models oder Views

    • Code kuerzer + uebersichtlicher

    • Komplexitaet + Fehler + Kosten nehmen ab

    • Produktivitaet + Robustheit + Gewinn steigen

    • Saubere Trennung in 3 unabhaengige, austauschbare Schichten


    Danksagung
    Dank an Manuel Blechschmidt fuer den BePHPUG Vortrag Design Pattern 2004 + Gespraeche ueber MVC
    Dank an Frankie Thuerigen fuer Gespraeche ueber Templates + Caching + AJAX.
    Dank an die Berliner PHP Usergroup fuer die informativen Vortraege + Gespraeche
    (cc) Creative Commons License

  • http://www.linkmatrix.eu/public/pdf/mvc/mvc.pdf

    SPEED (CACHED): 348.556 ms - 2017-10-24 04:10:16