PHP: Erstellen eines erweiterbaren CMS-Systems [geschlossen]

8

Ich habe eine neue Aufgabe vom Kunden erhalten, die im Grunde ein CMS für Schauspieler / Sänger und dergleichen schafft, die der Kunde an sie verkaufen wird.

Es ist im Grunde genommen ein Paket und würde out-of-box ähnlich wie WordPress funktionieren, Sie übergeben es einfach an jeden, der es kauft, aber natürlich wird das keine Blogging-Plattform sein. Es wird Entwicklern ermöglichen:

  • Plugins / Widgets hinzufügen
  • Vorlagen / Themen hinzufügen

Ich dachte, das Beobachtermuster könnte nützlich sein, aber ich bin mir da nicht so sicher. Was ihr euch vorstellen könnt, um solch ein flexibles / erweiterbares CMS in Bezug auf Folgendes zu erstellen:

  • Möglichkeit Plugins hinzuzufügen (zum Beispiel wie WordPress)
  • Möglichkeit, Themen / Vorlagen hinzuzufügen (zum Beispiel wie WordPress)
  • Entwurfsmuster
  • Andere Dinge
Sarfraz 28.07.2010, 18:58
quelle

1 Antwort

19

Observer ist in Ordnung, aber Sie müssen darüber nachdenken, über das Grundmuster hinauszugehen. Das kanonische Observer / Subject-Muster sendet nur das Subject-Objekt an den Observer, nichts anderes, nicht einmal warum es benachrichtigt wird.

Zu Beginn scheint die Lösung möglicherweise auch den Grund für die Benachrichtigung des Observers zu enthalten, aber dann könnten Sie am Ende Beobachter benachrichtigen, die sich nicht um bestimmte Benachrichtigungen kümmern. Eine bessere Lösung könnte sein, dass Beobachter auch eine Liste von Benachrichtigungen anfordern müssen, die sie erhalten möchten.

Aber das stellt auch ein Problem dar. Damit sich die Beobachter tatsächlich an Subjekte binden können, müssen sie instanziiert werden. Jedes Mal. Selbst wenn sie nie gebraucht würden. Das ist dumm .

Wir haben also schnell eine der kanonischen PHP-Implementierungen von Plugins erreicht: "hooks". Hooks verwenden das gleiche Konzept wie Observer / Subject, aber die Implementierung unterscheidet sich in einer sehr wichtigen Weise: Die tatsächlichen Observer werden nicht instanziiert, um Subjekte zu beobachten. Stattdessen senden Subjects eine Benachrichtigung an einige verschiedene zentrale Repositories. Dieses Repository ist mit einer Liste aller installierten und aktivierten Plugins (Observer) konfiguriert und enthält eine Liste aller Ereignisse, die jedes Plugin erhalten möchte. Jedes Plugin wird nur dann benachrichtigt, wenn das Ereignis stattfindet, oft über eine statische Methode, anstatt eine Instanz des Plugins zu erstellen und zu melden. call_user_func_array und ein guter Autoloader macht das unglaublich trivial.

Sie können daher eine einfache Schnittstelle für alle zu implementierenden Plugins erstellen. Zu den Methoden, die Sie benötigen, gehören unter anderem:

  • Etwas, um Daten über das Plugin zu erhalten, wie Name, Autor, offizielle Website, Version, usw. Informationen zum menschlichen Konsum.
  • Eine Methode, die die Ereignisse zurückgibt, die das Plugin abonnieren möchte.
  • Eine Installationsmethode für Dinge, die das Plugin tun muss, um sich selbst zu installieren, wie zum Beispiel die Datenbank zu manipulieren.
  • Eine Deinstallationsmethode könnte ebenfalls hilfreich sein.
  • Die (wahrscheinlich statische) Methode, die Ereignisbenachrichtigungen empfängt und die erforderlichen Daten zurückgibt.

Abhängig davon, wie weit Sie das Plugin-Konzept nehmen, könnten Sie am Ende Plugins mit benutzerkonfigurierbaren Optionen erhalten. Sie müssen dies möglicherweise berücksichtigen. Auf dieser Straße liegen Wahnsinn und Konfigurationssysteme.

Um Plugins effektiv zu machen, müssen Sie hooks überall platzieren und häufig mit Endbenutzern arbeiten, um neue Hooks dort hinzuzufügen, wo sie benötigt werden.

Widgets können leicht auf ähnliche Weise funktionieren, wie Plugins, die vor dem Seitenrendering aufgerufen werden.

Themen / Vorlagen, oh mein Gott. Sie haben wahrscheinlich zwei große Möglichkeiten.

  1. Smarty oder eine ähnliche Template-Engine. Oder Ihre eigene Nicht-PHP-Template-Engine.
  2. PHP-Vorlagen.

Diese Entscheidung wird von Ihren Endbenutzern getroffen. Smarty ist unglaublich einschränkend, aber wenn Sie sicherstellen möchten, dass nur genehmigter Code in einer Vorlage ausgeführt wird, ist dies möglicherweise eine praktikable Option. Außerdem ist es nicht unsicher, Smarty-Vorlagen direkt in der Anwendung zu bearbeiten.

Auf der anderen Seite ist einer der Gründe, warum Wordpress-Templates so gut funktionieren, dass sie reines PHP sind. Sie können jede Methode aufrufen, die in der Wordpress-API verfügbar ist, und sogar ihre eigene interessante Logik verwenden. Wenn Sie erwarten, dass Ihre Endbenutzer technisch oder zumindest technisch kompetent sind, dann sind PHP-Vorlagen der richtige Weg. Auf der anderen Seite kann das Editieren von PHP-Templates innerhalb der Anwendung eine große potentielle Sicherheitslücke eröffnen, wenn ein böswilliger Benutzer in die Admin-Bits gelangt. Wahrscheinlich möchten Sie die Bearbeitung auf das Dateisystem beschränken.

Während dies die HTML-Erstellung abdeckt, sollten Sie auch CSS in Betracht ziehen. Können Ihre Endbenutzer CSS direkt manipulieren? Wollen sie das? Wenn Ihre Standardvorlagen genügend semantische Klassen enthalten, können sie wahrscheinlich mit wenig Aufwand viel Styling betreiben, wenn sie wissen, was sie tun. Auf der anderen Seite wissen Ihre Endanwender möglicherweise nicht, was CSS ist, also möchten sie, sagen wir mal, Farbwähler und vordefinierte Farbschemata und eine Farbschema-Auswahl und andere lästige Dinge, die Sie erstellen können. Es ist wahrscheinlich am besten, jetzt über diese Schrecken nachzudenken.

Verschiedene Dinge.

Kein CMS wäre ohne das Konzept von Entwürfen und Veröffentlichungszuständen vollständig. Ich habe hier keinen Rat für dich, außer code this first . Wenn Ihr Kunde oder die Endbenutzer eine historische Archivierung, einen Genehmigungsmechanismus für die Verwaltung oder irgendetwas anderes möchten, das den Entwurf / die Veröffentlichung zu etwas anderem als einem einfachen Statusfeld macht, müssen Sie dies sehr bald wissen. (Ich wurde schrecklich von diesem gebissen.Wir hatten das gesamte System um ein einfaches veröffentlichtes / nicht veröffentlichtes Modell herum entworfen und bekamen ungefähr 9/10 durch Spec-Building und verwandten Prototyp-Code, als wir realisierten, dass es nicht funktionieren würde und wir etwas weit, viel mehr tun müssten komplex, um die Kundenanforderungen tatsächlich zu erfüllen. Der grober Plan war der größte Zeitverlust, dem wir bisher begegnet sind.)

Verwenden Sie ein ORM? Wenn nicht, stellen Sie sicher, dass Sie eine geeignete Datenbankschnittstellenbibliothek verwenden. PDO, oder vielleicht etwas von PEAR, oder vielleicht Zend_Db. Sie werden unweigerlich einen Kunden haben, der darauf bestehen , dass der Code auf Oracle oder MSSQL ausgeführt wird. Oder SQLite. Es ist schön, ihnen zu sagen, dass es (mit etwas Aufwand) getan werden kann. Plugin-Autoren werden Ihnen auch für die geistige Gesundheit danken. Nicht rollen Sie Ihre eigenen.

(Wiederum, mit deiner Wiederholungsstufe, erwarte ich, dass du mit so ziemlich allem, was ich gesagt habe, bereits vertraut bin. Ah, die Dinge, die ich mache, um mich abzulenken, während ich über meine eigenen Codeprobleme nachdenke ... )

    
Charles 28.07.2010, 19:56
quelle