Technische Interna eines RAD-Frameworks ... als PHP-Entwickler bei Nooku
Veröffentlicht: 2022-03-11Jeder hat sein eigenes Instrumentarium. Als PHP-Entwickler ist einer meiner Favoriten ein Rapid Application Development Framework namens „Nooku“. Mit den Worten der Entwicklungsgruppe: „Nooku ist eher ein Webentwicklungs-Toolkit als ein Framework“.
Falls Sie es nicht kennen, schauen Sie es sich an. Es handelt sich um ein Open-Source-Projekt, das stark von branchenweit anerkannten Entwurfsmustern Gebrauch macht, um stark komponentenbasierte Anwendungen zu erstellen, die leicht erweiterbar und wiederverwendbar sind (ursprünglich von einem der führenden Joomla!-Entwickler erstellt). Nooku bietet Ihnen sofort eine Vielzahl von Tools für die schnelle Anwendungsentwicklung, mit denen Sie Projekte schneller auf den Weg bringen können. Eine kleine, aber starke Kostprobe:
- Eine Standardimplementierung von MVC, bei der Sie nur das Layout schreiben müssen (das hat mich süchtig gemacht)
- HMVC-Verfügbarkeit sofort
- Unterstützung für verschiedene Ausgabeformate wie JSON und XML für alle Ihre Daten (d. h. stellen Sie Ihre API in wenigen Minuten bereit)
- Standardverwaltungs- und Front-End-Implementierungen
Das Herzstück von Nooku ist das Designprinzip „Composition over Inheritance“ (tatsächlich ist es das erste Konzept auf der Nooku-Einführungsseite). In einer Zeile: Sie sollten darauf abzielen, die Funktionalität mehrerer Objekte zusammenzusetzen (oder zu addieren), um einige zu erstellen eine Art zusammengesetztes Objekt, anstatt sich auf Unterklassen zu verlassen.
Dieses Prinzip lässt Sie weniger Code schreiben und führt oft zu ziemlich eleganten Lösungen. Wie genau wird es beworben? Nun, auf Codeebene ergeben sich die besten Beispiele aus der Verwendung von Mixins und Ressourcen-/Dienstkennungen. Lass uns einen Blick darauf werfen.
Der Mixin
Vor PHP 5.4 hatte die Sprache kein Konzept von Traits . Dies sind klassenähnliche Strukturen, die, wenn sie von einem Objekt „verwendet“ werden, eine Art von Funktionalität bereitstellen (ähnlich wie bei Mehrfachvererbung). Nooku löst dieses Problem seit Jahren (seit PHP 5.2) mit dem Mixin .
Mit dem Mixin können Sie nicht nur Objekte zusammensetzen, sondern es fügt auch die Methoden jedes gemischten Objekts zur Schnittstelle des zusammengesetzten Objekts hinzu. Das Objekt, das das Mixin verwendet, scheint die Methoden des gemischten Objekts zu "erben".
/** * Mixin an object * * When using mixin(), the calling object inherits the methods of the mixed * in objects, in a LIFO order. * * @param KMixinInterface $object An object that implements KMinxInterface * @return KObject */ public function mixin(KMixinInterface $object) { $methods = $object->getMixableMethods($this); foreach($methods as $method) { $this->_mixed_methods[$method] = $object; } // Set the mixer $object->setMixer($this); return $this; }
Fast alle Objekte in Nooku haben diese Fähigkeit, weil sie die Basisklasse KObject erweitern, die die Mixin -Methode definiert hat.
Die Hauptklassen in der Controller-Architektur von Nooku stammen ebenfalls von KObject ab. Der abstrakte Controller ist die Klasse KControllerAbstract, und bei genauerer Betrachtung können Sie sehen, dass er die Mixing-Fähigkeit sofort nutzt. Immer wenn eine Instanz dieser Klasse erstellt wird, werden die Funktionen KMixinCommand und KMixinBehavior sofort zu ihrer Schnittstelle hinzugefügt. Folglich ist jeder Controller in Nooku mit Befehlsketten- und Verhaltensverwaltungsfunktionen durch die jeweiligen Objekte ausgestattet.
Warum das K vor allen Klassennamen? Die Hauptbibliothek von Nooku trägt den Codenamen „Koowa“.
Zurück zum Nooku-Controller: Die KMixinBehavior-Klasse enthält alle Teile, um KControllerAbstract die Möglichkeit zu geben, bestimmte Verhaltensweisen zur Laufzeit zu laden. Verhaltensstrategien sind Klassen, die einen Prozess oder eine Logik beschreiben, die abgetrennt und von anderen Klassen verwendet werden kann (z. B. bearbeitbar, bestellbar). KMixinBehavior ist ziemlich einfach und hat nur vier Methoden: getBehavior, hasBehavior, addBehavior und getBehaviors. Und das ist alles, was wir brauchen, um einem Objekt die Fähigkeit zu geben, mit verschiedenen Verhaltensstrategien umzugehen und diese einzukapseln.
Ebenso hat KMixinCommand nur drei Methoden: getCommandContext, getCommandChain, setCommandChain. Falls Sie es nicht erraten haben, bieten diese drei Methoden KControllerAbstract die Möglichkeit, eine Befehlskette zu implementieren, lassen dies aber zur Laufzeit zu.
Sie können sich dieses Mischen als einfache arithmetische Addition vorstellen:
Gibt uns eine Schnittstelle, die so aussieht:
Definitionsgemäß sollen abstrakte Klassen erweitert werden, und so erhalten alle Objekte, die Kinder oder Instanzen von KControllerAbstract sind, durch die Magie der Vererbung auch die Fähigkeit, Verhalten und eine Befehlskette zur Laufzeit hinzuzufügen.
Hört sich cool an. Aber was bedeutet das eigentlich? Kurz gesagt, Nooku bietet komponentenbasierte Funktionalität; Das heißt, Nooku ermöglicht es Ihnen, Ihre Funktionalität zu modularisieren und Funktionalitäten zur Laufzeit modulübergreifend zusammenzustellen.
Diese beiden Beispiele dienen zur Demonstration der Zusammensetzung. Sie dienen auch dazu, die Unterstützung des Nooku RAD-Frameworks für die weitere Komposition im Kern zu demonstrieren. Dies ist ein wichtiger Vorteil. Die oben zu KControllerAbstract hinzugefügten Methoden unterstützen das „Strategy Design Pattern“, indem sie Entwicklern die Werkzeuge an die Hand geben, um zu kapseln, was variiert, bevor eine Codezeile geschrieben wurde. Die Tatsache, dass die mixin()-Methode Teil jeder Erweiterung von KObject ist, bedeutet, dass Sie andere Verhaltensverwaltungsschnittstellen zu den meisten Objekten zur Laufzeit leicht definieren und hinzufügen können.

Dienst- und Ressourcenbezeichner und -lokalisatoren: Entkoppeln Sie meinen Klassennamen von meinem Objekt
Die Service- und Ressourcen-Identifikatoren und -Locators in Nooku bieten auch eine leistungsstarke Unterstützung für die Trennung von Bedenken.
Schauen wir uns noch einmal KObject, aber auch KService an. Wir können die meisten Dinge in Nooku als Dienst oder Ressource behandeln und sie als solche auf genau die gleiche Weise instanziieren und abfragen.
Stellen Sie sich einen Dienst als etwas vor, von dem Sie eine Ressource erhalten. Alle Dienste sind Ressourcen, aber nicht alle Ressourcen sind Dienste
Wenn Sie in ein Lebensmittelgeschäft gehen und ein Produkt kaufen, stellen Sie sich das Geschäft als den Service vor, dh eine Sammlung von Artikeln, die Sie durchsuchen können. und das Produkt als Ressource, d. h. eine einzelne Artikel-/Lösungslogik, die Folgendes sein kann:
- gezielt angeschaut ( Lesen ) (z. B. Blick auf eine Dose Tomatensuppe)
- im Laden bewegt (bearbeitet) (z. B. die Suppe in den Warengang bringen)
- zum Inventar des Ladens hinzugefügt oder daraus entfernt (hinzufügen und löschen ) (z. B. eine neue Art von Suppe hinzufügen und die Tomate loswerden)
Um dieses Beispiel noch weiter zu führen, stellen Sie sich vor, das Lebensmittelgeschäft hat eine Franchise-Abteilung und Sie möchten im Geschäft sein. In dieser Situation ist der Service die Franchise-Abteilung und die Ressource das Lebensmittelgeschäft, das Sie kaufen. Es ist sehr viel eine kontextbezogene Klassifizierung. Insgesamt ist dies als BREAD -Aktionsmuster bekannt (Sie werden jedes dieser Muster zwischen KControllerService und KControllerResource mit vorangestelltem '_action' sehen, dh _actionRead()).
Ein Modell kann ein Dienst sein, ein Tabellenobjekt kann als Dienst betrachtet werden, eine bestimmte MVC-Triade wird als Ressource oder Dienst instanziiert, während ein bestimmter Datensatz, der sich aus der Abfrage des Dienstes ergibt, als Ressource betrachtet werden kann.
Jedes Objekt in Nooku ist eine Zusammenstellung von Objekten, da jedes von ihnen einen Verweis auf die instanziierten Dienste der gesamten Anwendung in einem „Dienstcontainer“ und eine Methode für den Zugriff auf die Dienste namens getService() enthält. Alles, was die KObject::getService()-Methode erfordert, ist, dass wir eine gültige Ressourcenkennung übergeben und sie wird einen einsatzbereiten, instanziierten Dienst zurückgeben.
In der schnellen PHP-Anwendungsentwicklung bieten uns Ressourcen-Identifikatoren eine leistungsstarke Möglichkeit, die Instanziierung eines Objekts von seinem Klassennamen zu entkoppeln und somit Aliase für diese Identifizierung bereitzustellen. Dies hat wichtige Auswirkungen auf die Wartbarkeit einer Anwendung. Durch Aliasing kann ein Entwickler die Klasse ändern, die von jedem Objekt verwendet wird, das mit einem bestimmten Bezeichner instanziiert wird, indem er eine Codezeile mit KService::addAlias() hinzufügt.
Ein uns bekanntes Beispiel für eine Ressourcenkennung ist der URI oder Uniform Resource Identifier:
Dies sind alle Informationen, die KService benötigt, um die entsprechende Klasse zu finden und zu laden. Diese Teile stimmen mit Nookus Klassenbenennungs- und Platzierungskonventionen überein, die eine Vorhersagbarkeit der Platzierung und Instanziierung bieten. Das Bezeichnerbeispiel von oben (com://site/user.database.table.user) versucht, die Datei /components/com_user/databases/tables/user.php zu laden, die den Klassennamen ComUserDatabaseTableUser hat. Übrigens, wenn die Datei nicht existiert, gibt Ihnen das Framework ein Standardtabellenobjekt und erstellt es basierend auf Datenbankbenennungs- und ID-Schemakonventionen (das hat mich noch mehr gefesselt). Wie bereits erwähnt, können Sie mit KService auch Aliase für Ihre Kennungen festlegen. Using KService::setAlias('maindbaseadapter','com://admin/default.database.adapter.mysqli')
; Lassen Sie uns ein db-Objekt mit KService::getService('maindbaseadapter')
.
Dies gibt uns die erwähnte Entkopplung und einen deutlichen Vorteil bei der Wartung und Erweiterung unserer Anwendungen. Es steht uns frei, bei Bedarf andere Anwendungen als „Site“ und „Admin“ zu erstellen, und durch die hier beschriebenen Kennungen können wir problemlos Dienste in anderen Anwendungen nutzen, um unsere Lösungen dabei zu unterstützen, ihre Anforderungen zu erfüllen. Auch dies ist ein weiteres Beispiel dafür, wie Nooku PHP- und RAD-Entwicklern und -Teams kostenlos Unterstützung für die Komposition nicht nur einzelner Klassenobjekte, sondern ganzer Dienste und Anwendungen bietet.
Zusammenfassen
Mit Komposition über Vererbung im Mittelpunkt; die intelligenten, bereits bestehenden Zusammensetzungen und Strukturen, die existieren, um weitere Amalgame zu unterstützen; und der kostenlosen serviceorientierten Architektur mit den hier beschriebenen Identifikatoren bietet Nooku ein leistungsstarkes RAD-Framework mit einem deutlichen Vorsprung gegenüber allen anderen PHP-Entwicklungstools.