Zum Inhalt springen

MVC Pattern in PHP Verständnisrproblem


Empfohlene Beiträge

Hallo,

ich habe ein Verständnisproblem mit dem MVC Entwicklungsmodell/Pattern in PHP. In Java ist es mir klar, wie es funktioniert. Aber wie setze ich es in PHP um?

Ich hatte vor einer Weile danach gegoogelt, und bin darauf gestoßen: MVC mit PHP - Das MVC-PAttern mit PHP implementieren und verwenden

Wirklich verstanden hatte ich es danach auch nicht. Außerdem ist das ja eher auf dynamische Templates ausgelegt und weniger auf Datenbankanwendungen.

Ich dachte mir, dass es folgendermaßen funktioniert (ich bitte um Verbesserung):

Nehmen wir uns als Beispiel folgende Datenbanktabelle:


Artikel

artnr int not null primary_key

bez char(40) not null

instock int foreign_key

preis double

Wenn ich diese Tabelle anzeigen würde, würde ich es folgendermaßen gestalten (wir gehen mal davon aus, dass ich den Lagernamen (instock) bezogen habe aus der anderen Tabelle der Einfachheit halber):

Das Model (artikel_m.php):


public class artikel_m // extends DBModell oder aehnliches
{
private $artnr;
private $bez;
private $stock;
private $preis;
private $instock;

public artikel_m ($artnr = "", $bez = "", $stock = "", $stock = "", $preis = "", $instock = "")
{
if ($artnr == "" && $bez == "" && $stock == "" && $preis == "" && $instock == "")
{
// nicht uebergeben
}
else if ($anr != "")
{
// Daten aus DB beziehen
}
}

public static function get_saetze()
{
// Liest alle Artikel aus der Datenbank in artikel_m Objekte.
}

// Funktionen zum Aendern/Loeschen/Speichern
// Getter und Setter fuer die Klassenvariablen
}
[/PHP]

Die View (art_view.php):

[PHP]
<html>
<head>
<title>Artikelstammsatz anzeigen</title>
</head>
<body>
<table border="0">
<tr><td>Artikelnummer</td><td>Bezeichnung</td><td>Preis</td><td>In Lager</td>
</tr>
<?php
foreach ($art_arr as $ds)
{
echo("<tr><td>$ds->artnr</td><td>$ds->bez</td><td>$ds->preis</td><td>$ds->stock</td></tr>");
}
?>
</table>
</body>
</html>

Der Controller (art_controller.php):


<?php
include("artikel_m.php");
$art_arr = artikel_m::get_saetze();
include("art_view.php");
?>
[/PHP]

Bitte verbessert meine obige Erklärung zur Umsetzung des MVC Patterns anhand eines kleinen Beispiels. Ich hoffe, ich habe keine Fehler reingebracht, habe den Code nur hier abgetippt.

MFG derwunner

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Im Prinzip hast du damit schon mal ganz rudimentär das Ziel von MVC erfüllt, nämlich die Trennung der Darstellung(View) von der Programmierlogik (Model). Was noch fehlt, ist das Routing (Front Controller).

Ich würde dir empfehlen mit einem PHP-MVC Framework zu arbeiten. Es würde sich anbieten hierfür Zend oder Symfony2 zu benutzen. Wenn du dort den Anleitungen folgst, programmierst du ganz automatisch nach dem Entwurfsmuster.

Als Zusatz würde ich mir mal Folgendes genau angucken:

PHP: Constructors and Destructors - Manual

PHP: Classes and Objects - Manual

PHP: Alternative syntax for control structures - Manual (für die Views)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Im Prinzip hast du damit schon mal ganz rudimentär das Ziel von MVC erfüllt, nämlich die Trennung der Darstellung(View) von der Programmierlogik (Model). Was noch fehlt, ist das Routing (Front Controller).

Ich würde dir empfehlen mit einem PHP-MVC Framework zu arbeiten. Es würde sich anbieten hierfür Zend oder Symfony2 zu benutzen. Wenn du dort den Anleitungen folgst, programmierst du ganz automatisch nach dem Entwurfsmuster.

Als Zusatz würde ich mir mal Folgendes genau angucken:

PHP: Constructors and Destructors - Manual

PHP: Classes and Objects - Manual

PHP: Alternative syntax for control structures - Manual (für die Views)

Hallo, danke für die Infos. Aber einen Controller habe ich doch schon? Siehe oben die art_controller.php. Soviel ich weiß enthält das Modell nur die Daten. Je nach Philosophie kann das Model die Daten auch selbständig laden. Der Controller sollte doch die Logik enthalten, oder nicht?

In der Zwischenzeit habe ich hier noch ein paar sehr schöne Erklärungen gefunden:

 MVC - Schnell und einfach erklärt (inkl. Tutorial) - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

Und diese hier finde ich persönlich am besten: MVC - Model View Controller - Pinzke

Ich wollte es bewusst ohne Framework machen, denn mit einen Framework kann es ja jeder. Das hat meiner Meinung nach nicht mehr viel mit verstehen zu tun. Zend kenne ich auch, aber das ist doch für kleinere Anwendungen viel zu überdimensioniert. Das Zend Framework bringt ja auch einen eigenen Compiler und Debugger und noch vieles mehr mit, was an Komplexität fast nicht zu übertreffen ist. Symfony ist noch schlimmer meiner Meinung nach.

Ein Framework soll einem die Arbeit erleichtern, und nicht erschweren. -.-

Die beiden Frameworks haben also ihr Ziel aus dieser Sichtweise verfehlt.

Ich bin neulich durch Zufall auf das CakePHP Framework gestoßen: Understanding Model-View-Controller — CakePHP Cookbook v2.x documentation

Das sieht doch ganz gut und vernünftig aus. Wenn ich eines verwenden werde, dann das. Weil das ist auch für kleinere Anwendungen gut geeignet und bringt keinen unnötigen Schnick-Schnack mit. Das hat definitiv noch Zukunft, ihr werdet sehen! ;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

"Du bist ja süß"

Symfony 2 und ZF sind definitiv nicht überdimensioniert. Du willst erstmal lernen, dann ist ok dass selber zu programmieren. Aber da Zeit zu investieren ein eigenes Framework zu programmieren, dass eine vernünftige Dependency Injection oder Aspektorientierte Programmierung hat, ist es leichter sich mit den o.g. Frameworks auseinanderzusetzen.

Warum verwendest du eigentlich nicht PHP5?

Und warum ist dein artikel_m gleichzeitig ein DAO und ein Modell?

Schonmal wegen FatClient Thin-API und ThinClient und Fat-API Architektur nachgedacht?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo, danke für die Infos. Aber einen Controller habe ich doch schon? Siehe oben die art_controller.php. Soviel ich weiß enthält das Modell nur die Daten. Je nach Philosophie kann das Model die Daten auch selbständig laden. Der Controller sollte doch die Logik enthalten, oder nicht?

Nein, der Controller selbst holt keine Daten vom Speicher sondern verarbeitet sie und reicht sie an die View weiter. Weit ausgeholt handelt der Controller auch Daten (Sessiondaten, GET/POST/FILE-Parameter, ...). mit den Storagedaten hat aber nur das Model zu tun, wird aber vom Controller angesteuert.

- Model (holt/bearbeitet die Daten aus Dateien, Datenbank)

- View (Templatedateien, HTML-Ausgabe)

- Controller ("hält" beides zusammen, bestimmt, welches Modell aufgerufen wird und welche View ausgegeben werden soll)

Ich wollte es bewusst ohne Framework machen, denn mit einen Framework kann es ja jeder. Das hat meiner Meinung nach nicht mehr viel mit verstehen zu tun.

Dass du es selbst versuchen möchtest ist lobenswert. Jedoch gibt es verschiedene Möglichkeiten, "MVC" zu interpretieren und umzusetzen. Das unterscheidet sich selbst bei den großen Framworks (Zend, Symfony, Cake PHP, Codeigniter, ...). Wie die Architektur deines Frameworks aussehen soll, musst natürlich du selbst entscheiden. Ich schreibe auch ab und an aus langeweile an meinem kleinen MVC-Projekt, habe aber auch ein paar mal neu angefangen, da man manche Architektur-Probleme erst bemerkt, wenn man schon länger daran schreibt.

Der große Vorteil der Frameworks ist natürlich auch die Skalierbarkeit hoch. Wenn das Projekt also wächst, kann man es ohne Probleme den neuen Anforderungen anpassen, ohne am Framework selbst etwas ändern zu müssen. Wenn man mal schaut, welche Firmen die großen Frameworks einsetzen und welche Projekte sie damit realisieren, dann ist es natürlich meist etwas anderes, als die 5-Seiten-Homepage vom Friseur nebenan.

Einarbeiten muss man sich natürlich immer. Auch musst du nicht alles verwenden, was die Frameworks ermöglichen. Ob ein Framework + Einarbeitung Sinn macht oder ob man schneller was eigenes Entwickelt oder ein CMS verwendet, muss man natürlich selber entscheiden. Wir wissen nicht was du vor hast. Wie mit dem Beispiel mit dem Friseur: dafür braucht man sich weder in ein MVC-Framework noch in ein professionelles CMS wie Typo3 einarbeiten. Aber wenn man das Framework einmal beherrscht, sind kleine Projekte damit genauso realisierbar wie große. Und zwar ohne, dass man sich erneut einarbeiten muss. Also musst du entscheiden, ob du auch an künftige Projekte denkst.

Schau dir die pupären Frameworks (Zend, Symfony, Cake PHP, Codeigniter, ...) an, mach ein paar Tutorials und entscheide dann. Aber bei manchen hat man schnelle Resultate und steckt dann fest, bei anderen braucht man länger um es zu verstehen, kommt aber langfristig besser damit klar. Deshalb ist es schwierig, sich sofort für eins zu entscheiden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für eure Tipps! Und ja, ich sehe es jetzt ein, dass es besser ist ein Framework für größere Projekte zu verwenden, die längerfristig gesehen skalierbar sein sollen.

Ich wollte eigentlich nur so allgemein mal fragen, ein spezielles Projekt habe ich damit nicht vor. Ich möchte mich nur an Entwicklungsmodelle halten, wenn ich etwas programmiere. Denn das ist dann auch lesbarer für andere Leute.

Zum Thema sinnvoller Einsatz von Frameworks: Nun, ich sehe das so: Wenn ich ein Framework nicht komplett ausnutze, bzw. nur geringe Teile davon verwende, dann kann ich mir die paar Methoden auch selber schreiben, bin ich schneller. Z. B. wird ja auch bei jquery nicht gefragt, ob man es wirklich braucht, die meisten Leute binden es einfach ein. Jquery kann mehr als nur eine Bilderüberblendung oder ein Link-Mouseover Effekt. Wenn ich nur das haben will, naja, dann ist jquery wirkich übertrieben. Das sind 10 Minuten Arbeit, nicht mal!

Und zu der Frage, warum ich nicht PHP5 benutze: Soviel ich weiß ist Objektorientierung erst ab PHP5 möglich. In meiner Problembeschreibung verwende ich doch Objekte.

Ich mische auch nicht DAO mit dem MVC Pattern. Objektrelationales Mapping ist euch ein Begriff?! Genau das habe ich in meinen Model umgesetzt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zum Thema sinnvoller Einsatz von Frameworks: Nun, ich sehe das so: Wenn ich ein Framework nicht komplett ausnutze, bzw. nur geringe Teile davon verwende, dann kann ich mir die paar Methoden auch selber schreiben, bin ich schneller.

Aber bist du auch genau so gut? Ist es so sicher und bereits völlig getestet? Es ist nicht nötig das Rad ständig neu zu erfinden...

Vielleicht wächst dein Projekt weiter und brauchst die Funktionen doch. Der Grund "Ich brauche das meiste ja eh nicht", ist absolut kein Argument gegen die Nutzung. Du kannst auch ein "kleineres" Framework benutzen.

Desweiteren hast du denn nicht mehr diesen Vorteil:

Denn das ist dann auch lesbarer für andere Leute.

Soviel ich weiß ist Objektorientierung erst ab PHP5 möglich.

Das ist falsch! OOP ging in eingeschränktem Maße auch mit PHP4. Der PHP 5 Constructor ist "__construct()". DU benutzt den PHP4 Constructor.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...