Ankündigung

Einklappen
Keine Ankündigung bisher.

Aufbau von Modulen / Plugins

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Aufbau von Modulen / Plugins

    Hallo zusammen,

    ich würde gerne ein Modul-System entwickeln, bei dem Module aus Doctrine-Entitäten, REST-Controllern und Script-Dateien (JS, CSS, Templates) bestehen. Alle verfügbaren Module sollen in einem Verzeichnis zur Verfügung stehen und werden anhand einer Lizenz dynamisch geladen.

    Beispiel:
    - Im Verzeichnis liegen die Module a,b,c und d
    - Lizensiert sind die Module a und b
    - a und b werden geladen, c und d nicht

    Aktuell wird das ganze über eine zentrale Modul-Manager-Klasse gesteuert, die einfach die Verzeichnisse ausliest, den Autoloader registriert und die Script-Dateien in zentrale Loader speichert.

    Pseudo-Code:
    PHP-Code:
    foreach($moduleDirectoryPaths as $moduleName => $modulePath) {
        if(
    $license->isModuleLicensed($moduleName)) {
            
    $moduleManager->load($modulePath);
            
    // load führt durch:
            // registerAutoload('module/library', 'Namespace')
            // loadCss('module/public/css')
            // loadJs('module/public/css')
        
    }


    Nun würde ich Module eigentlich lieber als Klassen umsetzen. Dazu habe ich mir mal das Modulsystem des Zend Frameworks angeschaut. Hier würde das Modulverzeichnis etwa so strukturiert:

    Code:
    MeinModul/
    	Module.php => namespace MeinModul; Class Module...
    	public
    		images
    		css
    		js
    	src => autoload-Eintrag für dieses Modul
    		MeinModul
    			Entity
    			Api
    	test
    Der Ansatz ist ganz nett, allerdings finde ich das ganze etwas übertrieben / nicht wirklich intuitiv. Am meisten stört mich die doppelte Autoload-Struktur und der fehlende "globale" Namespace, z.B.:
    Code:
    /modules/MeinModul/src/MeinModul/...
             1--^          2--^
    
    Es wird der Namespace "MeinModul" genutzt, statt z.B. Andreas/MeinModul


    - Gibt es hier so etwas wie einen PSR oder eine Struktur, die sich durchgesetzt hat?
    - Oder ist ein Modul-System grundsätzlich nicht empfehlenswert?


    .
    Tutorials zum Thema Technik:
    https://pilabor.com
    https://www.fynder.de

  • #2
    Korrigiert das nicht PSR-4 das irgendwann kommt?

    Finde die Modulstruktur im ZF2 eigentlich ganz in Ordnung. Solang du deine Module nicht im modules sondern im vendor-Ordner ablegst, kannst du ja deinen Andreas-Namespace verwenden. Dass jetzt wahnsinnig viel mehr Namespace-Verschachtelungen innerhalb der Anwendung (im modules/-Ordner) nötig sind, sehe ich eigentlich nicht. Aber ich würd mich auch nicht als Software-Architekt sehen, ist nur meine Meinung.
    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

    Kommentar


    • #3
      Solang du deine Module nicht im modules sondern im vendor-Ordner ablegst
      Das wird spätenstens dann sehr unpraktisch, wenn Du die Module automatisch einbinden willst. Bspw. über Platzhalter im Markup.
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Zitat von Chriz Beitrag anzeigen
        Korrigiert das nicht PSR-4 das irgendwann kommt?
        soweit ich es sehen konnte ist der wesentliche unterschied von PSR-0 zu PSR-4 dass man nicht mehr den hauptnamespace im src ordner abbilden muss

        PSR-0
        vendor/symfony/config/Symfony/Component/Config

        PSR-4
        vendor/symfony/config/

        aber generell würde ich mir wegen autoloader, keine gedanken über ordnerstruktur machen

        PHP-Code:
        $modulManager = new ModulManager();
        $modulManager->add(new MyProject\Modulname1\Modul());
        $modulManager->add(new MyProject\Modulname2\Modul()); 
        der autoloader findet schon die module, du brauchst halt für dein Modul einen Interface mit der methode die beim add aufgerufen wird(ka boot() oder load() oder init() was auch immer)

        in der initialen methode des moduls, werden dann zb controller/repositories views etc in dependenci injection container geladen und auch routen definiert..

        deine grundanwendung braucht dann eben eine art core modul
        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

        Kommentar

        Lädt...
        X