MVC – Einführung durch ein eigenes kleines „Framework“

Model (M)

Nahezu jede Anwendung benötigt irgendeine Form der Datenhaltung. Die Idee hinter einer Abstrahierung durch ein Model ist, dass die Art und Weise dieser Datenhaltung (z. B. in einer Datenbank, Datei, Memcache, …) den Programmierer der Controller nicht kümmern muss.

Für unser Beispiel verwenden wir eine MySQL-Datenbank, die wir über PDO ansprechen. Da alle Models die selbe Basisfunktionalität haben werden, erstellen wir eine abstrakte Basisklasse.

Abstrakte Basisklasse für alle Models

Grundsätzlich gibt es zwei Wege ein ORM umzusetzen: Active Record und Data Mapper. Deren Unterschiede sind nicht Teil dieses Artikels, ich will nur erwähnen, dass wir hier unsere Models als Active Record implementieren.


Laden der Daten

Als Beispiel legen wir ein Model zur Benutzerverwaltung an:

Entsprechend dazu gibt es in der Datenbank eine Tabelle, in die wir auch gleich einen Testeintrag füllen.

Mit find() und findFirst() werden jetzt die Datensätze geladen. Dabei akzeptiert findFirst() eine Id als Parameter um den häufigsten Fall komfortabel zur Verfügung zu stellen.

Im Controller benutzen wir das Model folgendermaßen:

Der vollständige Code bis hierher (v0.4)


Daten anlegen und aktualisieren

Wie Daten geladen werden haben wir oben gesehen, jetzt benötigen wir noch eine Möglichkeit sie auch zu speichern. Eine rudimentäre save() Funktion könnte so aussehen:

Nachdem ein neuer Eintrag angelegt wurde, wird die Id der Datenbank abgerufen und dem Model zugewiesen. Falls die Id bereits vorhanden ist, wird in der Eintrag aktualisiert.

Um im Model bestimmte Felder mit Standardwerten vorzubelegen, können wir noch für jede Operation einen Hook anbieten (beforeCreate() und beforeUpdate()).

Implementiert das konkrete Model diese Funktion wird sie auch benutzt. Im Falle von User würden wir hier das aktuelle Datum in $this->created setzen.

Der vollständige Code bis hierher (v0.5)

Weiter mit Erweiterungsmöglichkeiten

4 Gedanken zu „MVC – Einführung durch ein eigenes kleines „Framework““

  1. Tolles Tutorial !!

    Eine Frage habe ich jedoch dazu:
    $stmt->execute($options[‚bind‘]);
    welche Parameter stehen in $options ?

    LG

    1. Der $options Parameter bei den find Funktionen, soll möglichst flexibel einsetzbar sein.

      Bisher versteht die findFirst() zum einen direkt eine ID ModelBase(23) und zum anderen die Definition von Parametern. Dann muss ein Array übergeben werden, dass sowohl die WHERE Bedingung und Platzhalterdefinition als auch die Werte für die Platzhalter enthält. Das sieht dann so aus:
      [
      'criteria' => 'userId = :uid',
      'bind' => [':uid'=>5],
      ]

      Hier gilt die Syntax von PDO.

      Die find() Funktion versteht nur die zweite Variante, da ja explizit mehrere Ergebnisse gefunden werden sollen und die ID immer nur eines liefern würde.

  2. Hallo,

    geniales Tutorial (vielen Dank!), welches ich gerne dazu nutzen möchte, meine Kenntnisse in OOP zu vertiefen!

    Eine Frage:
    Unterstützt dieser MVC-Ansatz auch das Konzept Post-Redirect-Get? Ich möchte, dass der Benutzer die Vor-/Zurück-Buttons im Browser nutzen kann, OHNE dass er ein Post-Formular extra noch einmal re-loaden muss.

    Danke und viele Grüße

    Jörg

    1. Hallo Jörg,

      das funktioniert ohne Probleme.
      Was du nach einen POST-Request an den User zurück gibst (Webseite, Redirect, …) hat mit MVC an sich nichts zu tun.
      Und jede Action hört erst mal auf alle Anfragen egal welcher Typ (GET, POST, PUT, …). Weitere Einschränkungen wären in diesem einfachen Beispiel die Aufgabe des Entwicklers. Praktisch alle Frameworks bieten hier Unterstützung an.

      Hoffe das hilft!

Kommentare sind geschlossen.