Organisation mehrerer Zend-Anwendungscodes

10

Im vergangenen Jahr habe ich an einer Reihe von Anwendungen gearbeitet, die alle auf dem Zend-Framework basieren und sich auf eine komplexe Geschäftslogik konzentrieren, auf die alle Anwendungen Zugriff haben müssen, auch wenn sie nicht alle verwenden (einfacher als mehrere Bibliotheksordner für jeden zu haben Anwendung, da sie alle mit einem gemeinsamen Zentrum verbunden sind).

Ohne näher darauf einzugehen, worum es in dem Projekt speziell geht, suche ich nach Informationen (da ich allein an dem Projekt arbeite) darüber, wie ich meinen Code "gruppiert" habe. Ich habe versucht, alles so aufzuteilen, dass Abhängigkeiten so weit wie möglich entfernt werden.

Ich versuche, es so entkoppelt wie möglich zu halten, sodass in 12 Monaten, wenn meine Zeit abgelaufen ist, jeder andere, der hereinkommt, kein Problem damit haben kann, das zu erweitern, was ich produziert habe.

Beispielstruktur:

applicationStorage\ (contains all applications and associated data)
applicationStorage\Applications\ (contains the applications themselves)

applicationStorage\Applications\external\ (application grouping folder) (contains all external customer access applications)
applicationStorage\Applications\external\site\ (main external customer access application)
applicationStorage\Applications\external\site\Modules\ 
applicationStorage\Applications\external\site\Config\
applicationStorage\Applications\external\site\Layouts\
applicationStorage\Applications\external\site\ZendExtended\ (contains extended Zend classes specific to this application example: ZendExtended_Controller_Action extends zend_controller_Action )
applicationStorage\Applications\external\mobile\ (mobile external customer access application different workflow limited capabilities compared to full site version)

applicationStorage\Applications\internal\ (application grouping folder) (contains all internal company applications)
applicationStorage\Applications\internal\site\ (main internal application)
applicationStorage\Applications\internal\mobile\ (mobile access has different flow and limited abilities compared to main site version)

applicationStorage\Tests\ (contains PHP unit tests)

applicationStorage\Library\
applicationStorage\Library\Service\ (contains all business logic, services and servicelocator; these are completely decoupled from Zend framework and rely on models' interfaces)
applicationStorage\Library\Zend\ (Zend framework)
applicationStorage\Library\Models\ (doesn't know services but is linked to Zend framework for DB operations; contains model interfaces and model datamappers for all business objects; examples include Iorder/IorderMapper, Iworksheet/IWorksheetMapper, Icustomer/IcustomerMapper)

(Hinweis: Die Ordner "Module", "Config", "Layouts" und "ZendExtended" werden in jedem Anwendungsordner dupliziert. Ich habe sie jedoch weggelassen, da sie für meine Zwecke nicht erforderlich sind.)

Für die Bibliothek enthält dies den gesamten "universellen" Code. Das Zend-Framework ist das Herzstück aller Anwendungen, aber ich wollte, dass meine Geschäftslogik unabhängig vom Zend-Framework ist. Alle Modell- und Mapper-Schnittstellen haben keine öffentlichen Verweise auf Zend_Db, sondern werden privat umbrochen.

Ich hoffe also, dass ich in Zukunft die Mapper und dbtables (die einen Models_DbTable_Abstract enthalten, der Zend_Db_Table_Abstract enthält) umschreiben kann, um meine Geschäftslogik vom Zend-Framework zu entkoppeln, wenn ich meine Geschäftslogik (Services) auf a verschieben möchte Nicht-Zend-Framework-Umgebung (möglicherweise ein anderes PHP-Framework).

Mit einem serviceLocator und der Registrierung der erforderlichen Dienste im Bootstrap jeder Anwendung kann ich je nach Anforderung und Zugriff auf die Anwendung unterschiedliche Versionen desselben Dienstes verwenden.

Beispiel: Für alle externen Anwendungen ist ein service_auth_External implementiert, das service_auth_Interface implementiert.

Gleiches gilt für interne Anwendungen, bei denen Service_Auth_Internal service_auth_Interface implementiert. Service_Locator :: getService ('Auth').

Ich mache mir Sorgen, dass mir dabei einige mögliche Probleme fehlen könnten.

Eine, über die ich nur halb nachdenke, ist eine config.ini-Datei für alle externen Dateien, dann eine separate Anwendung config.ini, die die globale externe config.ini überschreibt oder ergänzt.

Wenn jemand irgendwelche Vorschläge hat, wäre ich sehr dankbar.

Ich habe Contextwitching für AJAX-Funktionen in den einzelnen Anwendungen verwendet, aber es besteht eine große Chance, dass sowohl externe als auch interne Webdienste für sie erstellt werden. Auch diese werden aufgrund der Autorisierung und der verschiedenen verfügbaren Dienste getrennt.

\applicationstorage\Applications\internal\webservice 
\applicationstorage\Applications\external\webservice
user966936
quelle

Antworten:

1

Letztendlich ist ein Teil des Codes spezifisch für die "Geschäftslogik" Ihrer Anwendung, und ein anderer Teil ist "Bibliothekscode". Beispielsweise kann etwas, das die Formulareingabe validiert, im Allgemeinen als "Bibliothek" betrachtet werden, während etwas, das Ihnen bei der Berechnung der für Client X in einem bestimmten Monat verfügbaren Angebote hilft, eindeutig "Geschäftslogik" ist.

Dies ist eher ein Problem der Versionskontrolle, und es gibt viele Möglichkeiten, wie Sie diese bestimmte Katze häuten können. Tools wie Maven (und zu einem gewissen Grad Phing / Ant) wurden entwickelt, um Anwendungen aus verschiedenen, unterschiedlichen Quellen zusammenzustellen - basierend auf einer Art externer Konfigurationsdatei (im Allgemeinen XML). Dies bedeutet, dass Sie separate Repos für Bibliothekscode verwalten und bei Bedarf in Application X importieren können.

Wenn Sie die Kontrolle über Ihren Host haben, können Sie darüber nachdenken, Bibliotheksmaterial in den Include-Pfad zu verschieben - und dies als separates langfristiges Projekt beibehalten.

Sunwukung
quelle