Die meisten MVC-strengen PHP-Framework [geschlossen]

8

Ich habe ungefähr 6 Monate lang versucht, mich mit MVC-Mustern zu beschäftigen. Ich habe unzählige Artikel, Fragen und Antworten sowie Blog-Beiträge über MVC- und HMVC-Muster gelesen, aber ich verstehe es einfach nicht zu 100%.

Ich habe versucht, MVC zu lernen, indem ich eines der weit verbreiteten PHP-MVC-Frameworks, CodeIgniter, angewendet habe. Ich habe damit einige interne Websites für mein Unternehmen implementiert. Und trotzdem verstehe ich es nicht zu 100%. Ich glaube, eine der besten Möglichkeiten, etwas zu lernen, besteht darin, streng definierte Regeln zu befolgen.

Meine Frage lautet also: Was ist das strengste PHP-Framework in Bezug auf die Implementierung des MVC-Musters? Eine, die definiert, wie ich Modelle, Controller und Ansichten verwende, damit ich vollständig verstehen kann, was MVC ist?

Kidonchu
quelle

Antworten:

13

Kurze Antwort

Es gibt keine solche Sache.

Längere Version:

Frameworks implementieren kein MVC- oder MVC-inspiriertes Entwurfsmuster. Ihre Bewerbung tut es.

MVC ist keine magische Sauce, die Sie Ihrer Anwendung hinzufügen können, indem Sie sie in einem Framework ablegen. Stattdessen müssten Sie dieses Muster (und die damit verbundenen Prinzipien und Praktiken wie SOLID , LoD , SoC ) tatsächlich lernen und verstehen . Nur dann können Sie versuchen, es innerhalb Ihrer Wahl eines Frameworks zu verwenden.

Wenn ein Framework ankündigt, dass es "MVC hat" , dann ist es völlig verrückt . In dieser Situation wird es verwendet, um das Framework an die Noobs zu "verkaufen", die sich mehr für den neuesten Hype als für das Anwendungsdesign und die Codierungspraktiken interessieren.

Das Ziel eines Frameworks wäre es, Ihnen eine Sammlung von Tools zur Verfügung zu stellen, die Ihnen als Ganzes eine veränderte / verbesserte Entwicklungsumgebung bieten. Sie befassen sich mit Routing, Autoloading, Abstraktionen auf niedriger Ebene für die Speicherung (nein, ich spreche nicht von Anti-Patterns für aktive Datensätze) und dem Rest der Dinge, mit denen Sie Zeit bei der Entwicklung und Wartung von Boh sparen können.

Abschließend.

Es gibt keine MVC-Frameworks in PHP. Alle, die dies für mich behaupten, gehören tatsächlich zu den schlimmsten. Nämlich - Codeigniter, Cakephp und Yii. Vermeiden Sie sie um jeden Preis (außer wenn Sie dafür wirklich gut bezahlt werden).

Wenn Sie benötigen einen Rahmen zu verwenden, die derzeit besten Optionen würden neueste Version von Symfony 2.x, Zend Framework 2.x oder Laravel 4.x. sein Diese implementieren MVC nicht für Sie, sondern schaden Ihrer eigenen Anwendungsarchitektur am wenigsten.

Mefisto
quelle
7
-1 Einige Frameworks eignen sich eindeutig besser für MVC als andere. Normalerweise sind es diejenigen, die Modelle, Ansichten und Controller enthalten.
Rein Henrichs
7
Modell ist keine Klasse. Es ist eine Anwendungsschicht. Wenn Sie ein Framework mit "Modellen" haben, ist dies ein klarer Hinweis, der nicht einmal im Zusammenhang mit MVC-Entwurfsmustern oder Konzepten steht, auf denen MVC basiert.
Mefisto
7
... es ist eine Anwendungsschicht, die auf irgendeine Weise geändert werden muss. In einer OO-Sprache bedeutet dies normalerweise die Verwendung von Objekten, dh die Verwendung von Klassen. Auf jeden Fall bin ich nicht daran interessiert, mich mit jemandem zu beschäftigen, der so offen unhöflich und feindlich gegenüber den Ideen anderer ist, also lasse ich das in Ruhe.
Rein Henrichs
6
-1 Das OP forderte ein Framework, das die Verwendung des MVC-Musters in der Anwendung unter Verwendung des Frameworks strikt erzwingt. Ihre Antwort betraf "das beste" Framework und die Philosophie zu Frameworks im Allgemeinen und beantwortete die Frage des OP nicht.
Programmierer
3
+1 Ich bin im Laufe der Jahre im Wesentlichen zu dem gleichen Ergebnis gekommen. Cake & Co sind die schlimmsten Straftäter. Sie können vielleicht etwas MVCish aus ihnen herausholen, wenn Sie sie lange genug einschlagen, aber sie sind wirklich nicht wirklich auf das tatsächliche MVC-Design ausgerichtet. Die beste Wahl sind in der Tat Frameworks, bei denen es sich nur um eine lose Sammlung von Komponenten handelt, mit denen Sie Ihre eigene Anwendung mithilfe ihrer allgemeinen Tools implementieren können.
Täuschung
7

Ich kann nur mit Cake sprechen, und ich kann in Bezug auf MVC nichts Gutes dazu sagen. Sie wissen nicht tun MVC Recht. Codeigniter ist sehr ähnlich. Es ist überhaupt nicht seltsam, dass Sie MVC auch nach einer Weile nicht "bekommen" haben.

Bei MVC geht es einfach darum, drei verschiedene Komponenten der Logik Ihrer Anwendung richtig zu trennen: den Kern der App , die Präsentation und den Klebstoff, die erforderlich sind, damit beide in einem realen Kontext funktionieren.

Der Kern Ihrer App, der die gesamte Geschäftslogik, Datenbankinteraktion, Dienste, Pieptöne und Boops enthält, die Ihre App zu "Ihrer App" machen, ist das Modell. Das Modell ist keine bestimmte Sache in einer bestimmten Form, es ist alles Notwendige, damit Ihre App so funktioniert, wie sie funktioniert. Sie haben nur ein "Modell", nämlich Ihre App.

Die Ansicht wird verwendet, um auf irgendeine Weise auszugeben, was Ihr Modell tut. Es ist die Benutzeroberfläche. Es ist alles Notwendige, um dem Benutzer nützliche Informationen anzuzeigen. Dies kann eine Website sein, es kann eine Befehlszeilenschnittstelle sein, es kann eine native Desktop-GUI sein. Sie können alle drei in Ihrer App verwenden.

Der Controller ist einfach alles, was übrig bleibt, damit dies funktioniert, hauptsächlich das, was Benutzereingaben aufnimmt und an den entsprechenden Ort leitet. Möglicherweise verfügen Sie über verschiedene Arten von Controllern für verschiedene Arten von Kontexten, z. B. einen, der eingehende HTTP-Anforderungen verarbeiten kann, einen, der die Befehlszeileneingabe verarbeitet, und einen, der mit GUI-Ereignissen verbunden ist.

Welche besondere Form diese einzelnen Teile annehmen, hängt ganz von Ihrer App ab. Alle drei können eine Art eigene Mini-Anwendung sein. Jedes "Modell" des Template-Prefab-Frameworks wurde für einen allgemeinen Fall erstellt, damit Sie schnell etwas zum Laufen bringen können. Oft ist es nicht die optimale Form, die Ihr Modell annehmen sollte. Sie müssen eine eigene Struktur für Ihre App erstellen, unabhängig davon, was für die Erstellung am besten geeignet ist. Informieren Sie sich über OOP-Prinzipien, SOLID, Abhängigkeitsinjektion usw. und erstellen Sie Ihr Kernmodell gemäß diesen Richtlinien. Wickeln Sie dann nach Bedarf Ansichten und Controller darum.

Der Punkt dieser Trennung ist einfach, die App wartbar und erweiterbar zu machen. Das Modell enthält nichts, was für eine bestimmte Form der Eingabe oder Ausgabe spezifisch ist. Beispielsweise enthält es keinen formatspezifischen Text (wie Fehlermeldungen im HTML-Format). Es wird keine bestimmte Form der Eingabe angenommen (wie HTTP-Anforderungen). Umgekehrt enthält die Ansicht keine Geschäftslogik, sondern nur die Ausgabe . Und der Controller enthält auch keine Geschäftslogik, seine Aufgabe ist nur die "Eingabe" . Der Grund ist einfach, dass sowohl der Controller als auch die Ansicht austauschbar sind, Ihre App jedoch nicht.

Wenn Sie hierfür ein Framework verwenden möchten, verwenden Sie ein modulares Framework, mit dem Sie alles tun können, was Sie tun müssen. Hierfür eignen sich am besten Zend-, Symfony-, Laravel- und ähnliche komponentenbasierte Pick-and-Choose-Frameworks.

täuschen
quelle
Vielen Dank, dass Sie einige Zweifel ausgeräumt haben! Ich habe irgendwie verstanden, was du meinst, wenn ich diese Zeile lese. Sowohl der Controller als auch die Ansicht sind austauschbar, Ihre App jedoch nicht. Eine Frage: In jeder Framework-Ordnerstruktur gibt es einen Ordner namens 'models'. Wenn 'meine App' selbst das 'Modell' ist, wie sollen sie dann wirklich heißen, diejenigen in diesem 'Modelle'-Ordner?
Kidonchu
Noch eine Frage ... wird dieses Tutorial als ähnlich wie Ihr Verständnis des MVC-Musters angesehen? Es scheint, dass sie etwas gemeinsam haben, aber ich bin nicht sicher; Insbesondere der Kommentar des Administrators zu allen Logiken in einem Modell mit vielen Entitätsklassen, dieser Link .
Kidonchu
Ich habe dieses Tutorial gerade überflogen, aber es scheint eher mit "echtem" MVC übereinzustimmen. Das Modell wirkt etwas dünn, aber hoffentlich nur, weil es nur ein Beispiel ist. Ich nenne meinen Modellordner "Modell", aber darin erstelle ich eine Reihe von Unterordnern. Normalerweise unterscheide ich zumindest zwischen "Primitiven" (wie Book), Diensten ("Aktionen", wie collateBookCollection) und Speicher ( saveBookToDatabase). Was Sie beachten müssen, ist, dass Sie nicht zu viel Code in den Controller einfügen, was Cake & Co. ist. völlig falsch verstehen. Machen Sie Ihr Modell stattdessen richtig fett.
Täuschung
Ich domain
nenne
7

Ein solcher Rahmen kann möglicherweise aus mehreren Gründen nicht existieren.

Zunächst ist das Modell im MVC-Muster der Teil, der Ihre Anwendung zu Ihrer Anwendung macht. Wenn ein Framework genau definieren würde, wie ein Modell aussieht, wäre dieses Framework nur für eine oder höchstens eine Handvoll Anwendungen verwendbar. Dies verhindert effektiv, dass es sich um ein Framework handelt.

Das zweite Problem ist, dass es keinen allgemeinen Konsens darüber gibt, wie eine ordnungsgemäße Anwendung des MVC-Musters aussieht. Einige sagen beispielsweise, dass der Controller der Ansicht die benötigten Daten aus dem Modell bereitstellen muss, während andere sagen, dass die Ansicht die benötigten Informationen selbst abrufen soll und der Controller nur sicherstellen sollte, dass die Ansicht weiß, wohin sie gehen soll Finde das Modell.
Ein weiteres Beispiel, das spezifischer für Webanwendungen ist, ist der Verarbeitungsaufwand, den die Ansicht ausführen kann. Für einige sollte die Ansicht ausschließlich aus HTML-Dateien bestehen, in denen einige Platzhalter durch den eigentlichen Inhalt ersetzt werden (normalerweise vom Controller aus dem Modell abgerufen), während andere mit der Verarbeitung der Benutzeroberfläche, z. B. Internationalisierung, vertraut sind des präsentierten Inhalts.

Bart van Ingen Schenau
quelle
1
Aha. Ich glaube, ich habe dieses Zitat einmal gesehen: "Wenn Sie zehn verschiedenen Personen fragen, was MVC ist, erhalten Sie zehn verschiedene Antworten." Ich denke, das ist es, was dein zweiter Punkt bedeutet.
Kidonchu
@kidonchu: Das ist ein Teil davon, obwohl Sie auch nicht überrascht sein sollten, 11 verschiedene Antworten von diesen 10 Personen zu erhalten ;-)
Bart van Ingen Schenau
2

Ich verstehe, dass dieser Beitrag ein Jahr alt ist, was ironischerweise der Grund ist, warum ich diese Antwort poste. Zunächst einmal haben einige der Leute, die diese Frage beantwortet haben, Recht. Sie werden nie wirklich ein PHP-Framework finden, das sofort "MVC Ready" ist ... unbedingt. Da das Framework eine Grundlage sein soll, auf der Devs nach MVC aufbauen können. Im letzten Jahr, seit dies veröffentlicht wurde, haben einige der PHP-Frameworks einen langen Weg zurückgelegt.

Ich habe ein bisschen mit CakePHP rumgespielt, bis heute ist es eine schreckliche, chaotische Einrichtung von Verzeichnissen und Strukturen, es gibt keinen klaren Unterschied zwischen Logik, es hat ziemlich schlecht kommentierten Code und alles ist irgendwie in einem Bündel zusammengepfercht Chaos. Das ist wohlgemerkt kein Scherz über CakePHP, das ist eine einfache Wahrheit.

Zend ist ausgezeichnet. Sie bieten exzellente Dokumentation und Code-Kommentare, haben eine sehr freundliche Community und bieten einen sehr schönen Rahmen für Entwickler, die sowohl Anfänger als auch Fortgeschrittene sind. Sie haben einen langen Weg zurückgelegt, seit das OP dies veröffentlicht hat.

Und zu den Leuten, die sagen, dass es keinen solchen Rahmen gibt, um die Frage des OP zu beantworten, haben sie Recht, wie ich oben sagte. Sie sind aber auch falsch. Zend, Laravel und CodeIgniter sind erstaunliche Frameworks, und obwohl sie Ihnen keine MVC "geben", ebnen sie Ihnen als Entwickler definitiv den Weg, um eine wunderschön erstellte MVC-Anwendung zu erstellen, wenn man bedenkt, dass Sie als Entwickler einer guten MVC folgen Praktiken Methoden Ausübungen.

Für diejenigen in diesem Thread ist CodeIgniter schrecklich. Sie liegen völlig falsch, zumindest nach heutigen Maßstäben. Zum Zeitpunkt dieses Beitrags beschäftigte ich mich nicht mit Frameworks, also hatte ich es mir damals nicht angesehen. Daher könnte es damals schrecklich gewesen sein. Aber ich benutze es jetzt ALLE meine Webanwendungen. Sie leisten hervorragende Arbeit bei der Erstellung eines soliden Frameworks mit einer verständlichen Verzeichnisstruktur und bieten Ihnen einige erstaunliche Tools, mit denen Sie MVC'ing starten können. Sie leisten hervorragende Arbeit bei der logischen Unterscheidung, sie haben eine großartige Community für Support und sie bieten insgesamt ein großartiges, kostenloses Framework, das sich wiederum in einige erstaunliche Anwendungen verwandeln kann, wenn Sie gute MVC-Praktiken befolgen.

Zum Hauptpunkt. Ich wollte meine Meinung zu diesem Thema einbringen. Sie werden nie das perfekte, von MVC gebaute, sofort einsatzbereite Framework finden. Wenn Sie jedoch gute MVC-Praktiken anwenden und ein solides Framework wie Zend, Laravel und / oder CodeIgniter wählen, ist dies in Ordnung. Denn die rohe Wahrheit ist, dass die MVC dem Entwickler überlassen bleibt, wie er bewährte Verfahren implementiert und nicht das Framework. Das Framework bietet die Grundlage, der Rest liegt beim Entwickler.

Gute Frameworks als Referenz

  • CodeIgniter
  • Zend Framework
  • Laravel
  • Symfony 2 (Nach dem Lesen des Kommentars hinzugefügt, da es auch ein ausgezeichnetes Framework ist)

Denken Sie daran, wenn Sie diese verwenden, liegt es an Ihnen als Entwickler, die guten MVC-Praktiken zu befolgen. Es gibt unzählige Tutorials zu guten MVC-Praktiken. Ich bin auf die Website eines Gentlemans gestoßen, die einige erstaunliche Richtlinien enthält, und er strebt eine ordnungsgemäße MVC an. Bisher waren seine Blog-Beiträge ziemlich verdammt gut, und er ist ein großartiger Ort, um mit dem Lernen zu beginnen.

Referenz

Jason
quelle
Ich verstehe, dass dieser Beitrag ein Jahr alt ist, was ironischerweise der Grund ist, warum ich diese Antwort poste. Die Frage wird jetzt tatsächlich als nicht zum Thema gehörend betrachtet, und ich habe dafür gestimmt, sie als solche zu schließen. Einer der Gründe, warum wir solche Beiträge jetzt als nicht zum Thema gehörend betrachten, liegt genau darin, dass die Informationen so leicht veraltet sind.
Martijn Pieters
Ich habe mich gefragt, warum Sie Symfony 2 ausgelassen haben. Dann habe ich den Hinweis auf Tommy gesehen und alles wurde klar.
Cerad
Du hast recht. Ich habe die Symfonie vergessen. Ich vergesse das immer, weil ich es selten benutze. Aber ich bin neugierig, wie hat mein Hinweis auf Tommy "es klar gemacht"? Was bedeutet das = P
Jason
Sagen wir einfach, dass Tom vor einigen Jahren einen der ernsthafteren Entwickler so geärgert hat, dass der Entwickler seine Dose mit Insektenspray herausgeholt hat. Es macht Spaß, Tom zu lesen, aber er lebt in einer anderen Realität.
Cerad
Ich werde da nicht widersprechen lol. Er ist wählerisch und sehr interessant und lebt definitiv in seiner eigenen Realität. Aber ich bewundere seine Model View Confusion-Serie. Und für mich hat er einen großartigen Ansatz für die richtige MVC. Aber das ist nur meine Meinung. Vielen Dank für die Klarstellung @Cerad
Jason
1

Es scheint, als hätten Sie nur Probleme, "alles zusammenzusetzen", weil viele Tutorials MVC nicht klar erklären können. Ich empfehle, dass Sie sich die Hände "schmutzig" machen und eine einfache Anwendung mit etwa 3 bis 5 verschiedenen Frameworks erstellen, um zu sehen, wie sie das Problem normalerweise angehen. Einige haben Dokumentation zum Einrichten der grundlegenden MVC-Architektur für eine Anwendung. Wenn dies nicht der Fall ist, können Sie immer ein paar MVC-Tutorials für dieses bestimmte Framework googeln.

FWIW Die Empfehlung für das Projekt- / Verzeichnislayout von Zend hat mir gefallen: http://framework.zend.com/manual/1.12/en/project-structure.project.html

Schauen Sie sich auch Rasmus '"Das No-Framework-PHP-MVC-Framework" an. Es zeigt, dass Sie kein Framework benötigen, sondern nur ein eigenes erstellen können, das Ihren spezifischen Anforderungen entspricht. Außerdem bekommst du einen Kick aus den Kommentaren! http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html

Programmierer
quelle
Ja, ich gebe zu, ich kann nicht alles zu einem Stück zusammenfassen. Ihr Link zu Rasmus 'Artikel hat jedoch einige Zweifel ausgeräumt. Insbesondere die Hauptidee "Keine Notwendigkeit eines Frameworks zur Implementierung des MVC-Musters". Vielen Dank!
Kidonchu