MVC-Framework: Modulsystem

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • MVC-Framework: Modulsystem

    Hallo!

    Ich schreibe zurzeit ein PHP5-MVC-Framework für den privaten Gebrauch, weil ich mir erhoffe dadurch einige Dinge zu lernen.
    Zurzeit stehe ich aber noch vor einem Aufbau-technischen Problem, zudem mir keine genug gute Lösung einfällt.

    Erstmal zu den Umständen…
    In meinem Framework gibt es wie in fast jedem anderen einen System und einen App Ordner, welche sich ja selbst erklären sollten. Im System Ordner sind eben alle Libraries, welche schon mit dem Framework kommen und einige andere Systemdateien (Datenbanktreiber, Scaffolding-Views etc). Im App Ordner entwickelt der Entwickler dann seine Anwendung, mit Controllern, Models, Views und eigenen Libraries, welche auch System-Libraries erweitern können sollen.

    Zum besseren Verständnis mal grob meine Ordnerstruktur:
    System
    - libraries
    - modules

    App
    - configs
    - controller
    - models
    - views
    - libraries
    - modules

    So weit so gut.

    Zum Problem...
    Nun stört mich an diesem Aufbau, dass z.B die Datenbanktreiber in einem Ordner rumliegen und nur durch Bearbeitung des Orginales erweitert werden können. Auch wenn ich es jetzt hier wie bei den Libraries machen könnte, will ich das nicht. Schliesslich gibt es auch noch andere Dateien, die ich so erweiterbar machen will (z.B die Scaffolding-Views und das Scaffolding-Model). So kam ich auf die Idee das in Module aufzuteilen:
    Jedes Modul hat einen Controller welcher eben das Modul kontrolliert. Im Falle der Datenbanktreiber soll es eben die Datenbankklasse sein, und beim Scaffolding die eigentliche Scaffolding-Klasse. Jedes Modul soll durch eine eigene Konfigurationsdatei eingestellt werden können.
    Jedes Modul soll also aus einem Modul-Controller, eventuell benötigten Views, Models, Interfaces, Configs und allem anderen bestehen.
    Da ich in solchen Dingen Perfektionist bin, suche ich immernoch nach der perfekten Lösung, mit folgenden Kriterien:

    Module sollen genau wie Libraries gehandhabt werden können, und idealerweise nicht von ihnen Unterschieden werden müssen.
    Bedeutet: Entweder müssen die Module einfach eine Erweiterung zu einer bestehenden Library sein (wobei die Library den Modul-Controller darstellt) oder jede Library ein Modul sein (wobei dann genau das umgekehrte der Fall ist, nämlich dass der Modul-Controller die Library darstellt).

    Ein Modul soll wie schon gesagt unter anderem Interfaces und Configs haben. Bisher trenne ich zur besseren Übersicht die Configs in einem abgesonderten Ordner im App-Ordner. Das soll auch bei den Modulen der Fall sein…
    Nur die Interfaces die ein Modul benötigt, benötigen höchstwarscheinlicherweise auch andere Module. Sollen diese auch getrennt werden (Was den Nachteil hat, dass die Dateien eines Modules nicht zentral zusammengelegt sind und ich dort wieder ein eigenes System für die Erweiterung der Interfaces schreiben muss was den Entwickler wiederrum verwirren könnte) oder im Modul-Ordner sein (was den Nachteil hat das sie nicht in anderen Modulen genutzt werden können).

    Zur Erweiterung der Module hätte ich schon eine Idee, bzw. eine ganz einfache Lösung: Wenn man ein Modul erweitern will, legt man im App Ordner einfach die Dateien an, die man erweitern möchte. Wenn eine Datei die benötigt wird im Modul im App-Ordner existiert, wird diese geladen, sonst die aus dem Modul Ordner im System-Ordner. Klassen können auch erweitert werden. Die Klassen im System-Ordner haben einfach ein Prefix, und die im App-Ordner nicht.

    Also: Wie realisiere ich das Modulsystem am besten, performantesten und für den Entwickler möglichst einfach verständlich?

    greez

    bitsnack
  • Habe gerade keine Zeit auf den ganzen Thread einzugehen.
    Aber der System Ordner sollte immer komplett austauschbar sein. Man sollte ihn löschen können um ihn zum Beispiel durch eine neuere Version zu ersetzen.
    Der App Ordner sollte wieder bis auf die Ordnerstruktur komplett leer sein. Dementsprechend musst du das "Standardverhalten" in System definieren.