2010-05-18 8 views
61

Manche Leute halten WordPress für eine Blogging-Plattform, manche halten sie für ein CMS, manche bezeichnen WordPress als Entwicklungsumgebung. Was auch immer es ist, die Frage bleibt immer noch. Ist WordPress MVC kompatibel?Ist WordPress MVC kompatibel?

Ich habe die Foren gelesen und jemand fragte vor etwa drei Jahren über MVC. Es gab einige positive und einige negative Antworten. Während niemand genau weiß, was MVC ist und jeder auf seine Art denkt, gibt es immer noch ein allgemeines Konzept, das in allen Diskussionen präsent ist.

Ich habe wenig Erfahrung mit MVC-Frameworks und es scheint nichts über das Framework selbst zu sein. Der Großteil der MVC wird vom Programmierer erledigt, habe ich recht? Nun, zurück zu WordPress, könnten wir die Core Rewrite Engine (WP_Rewrite) als Controller betrachten? Abfragen & Plugin-Logik als Modell? Und Themen wie die Aussicht? Oder verstehe ich alles falsch?

Dank;)

+1

MVC ist ein arquitectural Design-Muster und unabhängig von der Art der Sofware. Jede Blogging-Plattform, jedes CMS oder Entwicklungs-Framework kann MVC sein, abhängig davon, wie es funktioniert. – eKek0

+0

eKek0, dachte so. Aber hey, es sollte einige Beispiele für CMS und Frameworks geben, die nicht MVC-konform sind, d. H. Ihre Kernarchitektur ist überhaupt nicht MVC. Kannst du an etwas denken? – kovshenin

Antwort

45

Wordpress selbst ist nicht in MVC, aber man kann sehr MVC orientierte Themen und Plugins innerhalb des Frameworks erstellen. Es gibt mehrere Werkzeuge, die helfen können:

Wordpress MVC Lösungen:

MVC Threads auf WordPress.org Ideen und Trac:

+1

Die MVC-Ideen scheinen sehr unpopulär zu sein - fast alle werden zu Tode gestimmt. – Hexodus

9

Wie bereits in den Kommentaren erwähnt, ist MVC ein architektonisches Design-Muster, kein spezifischer Rahmen, und nicht, Wordpress nicht das MVC-Muster folgen.

Es gibt eine Trennung von Sichten (Templates) von der Programmierlogik, aber nur im Frontend, nicht im Admin-Panel und eine generelle Trennung von Sichten und Anwendungslogik ist nicht zwangsläufig MVC. Eine Implementierung des MVC-Musters nimmt normalerweise eine Art objektorientiertes Programmierparadigma an und Wordpress ist hauptsächlich implementiert in einer prozeduralen Weise, mit einfachen SQL-Abfragen in den PHP-Funktionen, daher auch kein tatsächliches Modell.

24

Wordpress ist irgendwie MVC. Wenn überhaupt, ist es ein Pull-Typ-MVC-Layout, bei dem die Ansicht Daten aus dem Modell "zieht". Es tut dies auf eine sehr prozedurale Weise, anstatt viele verschiedene Objekte zu verwenden, aber dies macht die Front-End-Vorlagen tatsächlich viel einfacher zu schreiben.

Dies gibt auch die Ansichten ein gewisses Maß an Controller-Logik (also die Art-Sorta-MVC).

Lassen Sie uns dies ausführen: Wordpress ruft eine URL. Der Wordpress-Kern agiert als Controller und bestimmt, welche Initialabfragen der Datenbank ausgeführt werden sollen und welche Erweiterung (Kategorieansicht, einzelner Post- oder Seitenaufruf usw.) geladen werden soll. Es packt dann diese INTIAL-Abfrageantwort und sendet sie an die Ansichtsdatei.

Diese Ansichtsdatei kann eine strikte Nur-Anzeige-Datei sein ODER sie kann zusätzliche Informationen/Abfragen über den eingebauten hinaus anfordern. Dies ist der Pull-Typ des MVC, bei dem die Ansicht Daten aus dem Modell zieht, anstatt dass der Controller Daten aus dem Modell in die Ansicht "schiebt".

Wenn die Ansicht also Code sieht, um eine Sidebar oder einen Widget-Bereich zu laden, fragt sie nach diesen Informationen. Welche Widgets jedoch vorhanden sein sollten, hängt vom Controller ab, der das Modell auf die Widgets in der Seitenleiste prüft und dann diejenigen Elemente auswählt, die auf der aktuellen Seite angezeigt werden, und diese an die Ansicht zurückgibt.

Dass jeder Teil davon kein Objekt ist, macht es nicht weniger MVC. Sie können den WP-Kern ändern, ohne (unbedingt) etwas an einem Thema zu ändern. Solange Sie integrierte Funktionen wie 'get_pages()' verwenden, können sich das Modell und die Datenbanktabellen ändern, solange diese Funktionen die richtigen Daten zurückgeben. Das Modell ist also unabhängig von der Ansicht, und der Controller ist ebenfalls unabhängig (außer wenn die Ansicht Controller-Logik hinzufügt, um mehr zu tun, als der Kern normalerweise tut).

Während Sie ein Modellobjekt haben könnten, das eine Anzahl von Methoden und Sachen wie WPModel :: get_pages ('blah blah') enthält und alles auf diese Weise enthält, gibt es immer noch eine fundamentale Trennung von Bedenken.

Ansicht: Vorlagendateien Controller: WP Kern Modell: die verschiedenen Funktionen, die spezifische Datenverarbeitung behandeln.

Solange die Namen, Argumente usw. gleich bleiben (oder einfach nur neue hinzugefügt werden), bleibt die Trennung der Belange erhalten und man kann geändert werden, ohne die anderen zu stören.

Es ist keine super-saubere Version von MVC, (vor allem, wenn Haken beteiligt sind), aber auf einer grundlegenden Ebene beginnt es dort.

Und darüber zu verfahren ist keine schlechte Sache IMO. Eine Anfrage von einer Website ist ziemlich inhärent procedural: Es ist ein Prozess mit einem klaren Anfang und Ende, und benötigt nur eine Prozedur, um die Anfrage zu verarbeiten, Daten zu erhalten, zu verpacken und dann zu sterben. Sie können diese Schritte mit Objekten und Objektmethoden und OOP-Layouts einrichten (was einige Dinge einfacher machen würde) oder Sie können einfach viele Funktionsaufrufe schreiben und sie auf diese Weise trennen. Klassenmitglieder wie private Variablen sind auf diese Weise verloren, aber abhängig von den Bedürfnissen der Anwendung ... ist es Ihnen vielleicht egal.

Es gibt keine One-Grand-Art, die Entwicklung zu tun, und WP sitzt bei etwa 20% der Websites, so dass es etwas richtig macht. Wahrscheinlich etwas damit zu tun, dass die Leute keine komplexen Klassenhierarchien lernen/auswendig lernen müssen, um die Datenbank dazu zu bringen, die Frage zu beantworten, welche Seiten Kind von Seite x sind? und mit diesen Daten umgehen. Könnten Sie es mit OOP so einfach machen? Ja, aber wenn Joomla ein Beispiel dafür ist, wie schwierig es ist, eine komplexe benutzerdefinierte Website mit OOP zu implementieren, dann ist WP viel einfacher und schneller und Zeit ist Geld.

+0

Ich kommentiere meine eigene Arbeit hier. Wordpress ist nicht MVC von sich selbst. Tatsächlich sind die Entwurfsmuster, die es direkt aus der Box herausholt, definitiv keine MVC. In der Regel verwende ich die Ansichtsdateien wie page.php als ein Controller-Bit des Skripts (Vorbereitung von Variablen, Geschäftslogik, usw., und sprechen mit der DB, falls erforderlich) und laden Sie dann eine separate Ansichtsdatei, z. Seitenansicht.php. Ich mache es seit einer Weile so. Ich vergesse, wie kompliziert normaler WP-Code ist, bis ich mir das überkomplizierte Zeug ansehe, das da draußen ist. – Rampant

2

RokkoMVC ist ein Mikro-MVC-Framework speziell für WordPress gebaut. Das Projekt soll die AJAX-Funktionalität in WordPress-Anwendungen vereinfachen und alle anderen Vorteile der Verwendung von Modellen, Ansichten und Controllern für Ihr Design bieten.

4

Nur um zur Liste der Optionen hinzuzufügen, (ich bin zugegebenermaßen voreingenommen als der Autor) swpMVC ist ein voll ausgestattetes, leichtes MVC-Framework, inspiriert von Rails, Sinatra, Express, und FuelPHP. Es ist gründlich dokumentiert, und während ich wp-mvc verwendet und genossen habe, wollte ich etwas, wo die Modelle in der Lage waren, Ansichten selbst zu füllen, einschließlich Formularsteuerelemente für die Interaktion mit diesen Modellen.

Ich habe dies zusammen weitgehend die Menge der Controller-Code zu reduzieren, die erforderlich zusammen eine App auf der Wordpress zu setzen, und das Ergebnis ist eine sehr schnelle und effektive Rahmen, die in Wordpress läuft. Die Modelle basieren auf PHP Activerecord und 8 Modelle sind für bestehende WordPress-Datentypen enthalten, einschließlich Post, PostMeta, User, UserMeta, Term und ein paar mehr. Die Modellierung von Daten ist dank der activerecord-Bibliothek sehr einfach und ich habe die Arbeit mit diesem Framework bisher sehr genossen.

Auch Schiffe mit Unterstreichungs PHP und PHP Schnell Profiler (wie in FuelPHP gesehen.)

+1

Wow, toller Job Brian! Sehr cooler Rahmen, ich werde es versuchen. – Hexodus

1

ich ein Bash hatte vor kurzem ein Plugin zu schaffen, die die Verwendung eines einfachen View-Controller-System, und ganz gefiel die Ergebnisse macht, also trennte ich die Vorlage aus to its own repo. Es bietet objektbasierte Controller, die Variablen lokal an PHP-Vorlagen, Vorlagenfragmente (Vorlagen innerhalb von Vorlagen) und Komponenten (Vorlagenfragmente mit eigenem Untercontroller) übergeben. Alles in zwei kleinen Klassen!

Natürlich schrieb ich diesen Code zu denken, dass kein anderer WP-Entwickler das Problem vor ;-) betrachtet hatte.

0

Es ist weit entfernt von MVC, es gibt keine Arta-Sorta-Sache wie manche Leute sagen, es ist entweder MVC oder nicht ... Die Tatsache, dass Sie Logik auf der Ansichtsebene schreiben qualifiziert es nicht als ein Mvc-Framework. Der Grund, warum Leute es benutzen - es ist einfach zu lernen, du musst kein Hardcore-PHP-Programmierer sein, sie sind faul.

+1

WordPress ist bei weitem nicht "einfach zu lernen", um es richtig zu benutzen, und IMO, das ist, weil es kein MVC-Muster verwendet. Es ist eine Mischung aus vielen Techniken und Design-Mustern, die im Laufe der Jahre eingeführt wurden. Die Codebasis kann ein Minenfeld sein, um zu verhandeln, und "der Faule" wird viele Probleme treffen, wie sie es mit jedem Framework tun werden. – Jason

+0

Es ist leicht zu lernen, im Vergleich zu Zend oder anderen geeigneten Frameworks wie CI ... Sogar Namenskonventionen lassen viel Raum für Verbesserungen. Komm schon!! – lokers

+1

Sie haben Recht - WP ist kein MVC. Ich habe gerade mit WP begonnen und der erste Blick in die Vorlagendateien eines sehr bekannten Themas hat mich erschreckt - das sieht nach dem Programmierstil aus, den die Leute vor 10 Jahren benutzt haben - html, php, css alles durcheinander. Geschäftslogik und Bildschirmdarstellung befinden sich an einem Ort. Versteh mich nicht falsch - WP ist sehr nett, aber es braucht eine Umschrift IMHO. – Hexodus

4

Eines der Themen, die in regelmäßigen Abständen in Diskussionen auftaucht, wie es bezieht sich auf Wordpress die Idee von Wordpress und MVC ist.

Aber die Sache ist, dass MVC nicht der Königsweg der Web-Entwicklung ist, dass wir versuchen, es zu machen, zu sein. Ja, es ist ein fantastisches Designmuster, und ich persönlich denke, dass es wie ein Handschuh zum Webanwendungsmodell passt, aber nicht jedes Framework oder diese Plattform implementiert dieses Designmuster.

Typischer Fall: Wordpress ist nicht MVC.

Und das ist okay. Ich denke, wir müssen den Wunsch aufgeben, es in unsere Projekte beiseite zu schieben, besonders wenn das Muster WordPress nicht nur ausreicht, sondern auch gut funktioniert, wenn es richtig eingesetzt wird.

„Aber ich liebe MVC!“

ich auch! Tatsächlich habe ich das letzte Jahr an einem Projekt gearbeitet, das die MVC-Architektur mehr oder weniger nachahmt. Ein High-Level-Beispiel für MVC.

enter image description here

A High-Level Beispiel MVC.

Zum Beispiel:

Views were implemented using templates 
Controllers were implemented by a combination of using function names like create, read, update, destroy, delete, and so on (even though these functions were hooked into the WordPress API 
Models were functions also were called to validate and verify data prior to serializing the data. Again, this required that certain functions be hooked into WordPress to achieve the desired result. 

Schließlich wird ein Satz von Regeln für das Umschreiben gab die Anwendung einen sauberen Satz von vorhersagbaren URLs im Format/people/update/1 oder/people/alle. Welches Muster implementiert WordPress?

WordPress implementiert die ereignisgesteuerte Architektur (von denen es mehrere Variationen gibt, wie das Observer Pattern).

Kurz gesagt, kann man konzeptionell daran denken wie die folgenden:

Things happen when WordPress is processing information. 
You can register your own function to fire when these things happen. 

Nicht zu kompliziert, oder? ein hochrangiges Beispiel für ereignisgesteuerte Muster enter image description here ein hochrangiges Beispiel für ereignisgesteuerte Muster

Wenn Sie beginnen, in Bezug auf das Paradigma zu denken, in der er arbeitet, anstatt zu versuchen es die Arbeit zu bilden So wie du willst, dass es funktioniert, es ist befreiend. Es hilft, Probleme viel einfacher zu lösen.

Die Quintessenz ist: WordPress implementiert das ereignisgesteuerte Entwurfsmuster, also selbst wenn Sie MVC implementieren, müssen Sie immer noch das Hook-System verwenden.

Wenn Sie nicht vorsichtig sind, können Sie am Ende versuchen, die perfekte Architektur zu erstellen, ohne Ihre Arbeit wirklich zu erledigen, und am Ende finden Sie sich so hoch in der Atmosphäre der Software, die Sie effektiv zu einer Architektur geworden sind Astronaut. Sie sagen also, Designmuster zu vermeiden?

Überhaupt nicht! Design Patterns erfüllen einen Zweck, weil sie vor allem Lösungen für zuvor und häufig gelöste Probleme bieten. Benutze sie!

Aber der Punkt, den ich versuche zu machen, ist, dass wir nicht versuchen müssen, die Dinge zum Muster zu zwingen, nur weil wir das Muster mögen. Das ist nicht ihre Absicht. Nutzen Sie stattdessen das primäre Muster, das Ihre Plattform der Wahl implementiert - in unserem Fall handelt es sich um ein ereignisgesteuertes Muster - und implementieren Sie dann Muster, wo sie passen (z. B. die Abhängigkeitsinjektion oder etwas Ähnliches).

Ansonsten ist es, als ob man versucht, den Fuß in einen Handschuh zu stecken.

Mit freundlicher Genehmigung (und total kopiert: P) von: http://tommcfarlin.com/wordpress-and-mvc/

Verwandte Themen