Çoklu Zend uygulama kodu organizasyonu


10

Geçtiğimiz yıl, hepsi Zend çerçevesine dayanan ve tüm uygulamaları kullanmasalar bile erişmesi gereken karmaşık bir iş mantığına odaklanmış bir dizi uygulama üzerinde çalışıyorum (her biri için birden fazla kütüphane klasörüne sahip olmaktan daha kolay hepsi ortak bir merkez ile bağlantılı olduğu için uygulama).

Projenin özellikle ne hakkında olduğu hakkında çok fazla ayrıntıya girmeden, kodumu nasıl "gruplandırdığım" konusunda bazı girdiler arıyorum (sadece proje üzerinde çalıştığım gibi). Hepsini bağımlılıkları olabildiğince ortadan kaldıracak şekilde bölmeye çalıştım.

Ben mantıksal olarak olabildiğince ayırmak için çalışıyorum, bu yüzden zamanım dolduğunda 12 ay içinde gelen başka kimse benim ürettiğim uzanan bir sorun olamaz.

Örnek yapı:

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)

(Not: Modüller, Config, Layouts ve ZendExtended klasörleri her uygulama klasöründe çoğaltılır; ancak amaçlarım için gerekli olmadıkları için bunları atladım.)

Kütüphane için bu tüm "evrensel" kodları içerir. Zend çerçevesi tüm uygulamaların merkezindedir, ancak iş mantığımın Zend çerçevesinden bağımsız olmasını istedim. Tüm model ve haritacı arabirimlerinin Zend_Db için genel referansları yoktur, ancak aslında özel olarak etrafına sarılır.

Umarım gelecekte iş mantığımı (hizmetlerimi) bir Zend olmayan çerçeve ortamı (belki başka bir PHP çerçevesi).

Bir serviceLocator kullanarak ve her uygulamanın önyüklemesi içinde gerekli hizmetleri kaydederek, isteğe ve hangi uygulamaya erişildiğine bağlı olarak aynı hizmetin farklı sürümlerini kullanabilirim.

Örnek: tüm harici uygulamalarda bir service_auth_External uygulama servisi_auth_Interface kaydedilecektir.

Service_Auth_Internal uygulama service_auth_Interface Service_Locator :: getService ('Auth') ile dahili uygulamalarda olduğu gibi.

Endişeliyim, bununla ilgili bazı olası sorunları kaçırıyor olabilirim.

Ben yarı düşünüyorum tüm dışsallar için bir config.ini dosyası, daha sonra ayrı bir uygulama config.ini geçersiz kılma veya genel harici config.ini için ekleme.

Herkes herhangi bir öneriniz varsa ben çok takdir ediyorum.

Bireysel uygulamalarda AJAX işlevleri için bağlam anahtarı kullandım, ancak hem harici hem de dahili web hizmetleri için onlar için oluşturulan büyük bir şans var. Yine, bunlar yetkilendirme ve mevcut farklı hizmetler nedeniyle ayrılacaktır.

\applicationstorage\Applications\internal\webservice 
\applicationstorage\Applications\external\webservice

Yanıtlar:


1

Sonuçta bazı kodlar uygulamanızın "iş mantığına" özel, bazıları da "kütüphane koduna" özeldir. Örneğin, form girişini doğrulayan bir şey genellikle "kütüphane" olarak kabul edilirken, belirli bir ayda X istemcisi için sunulan teklifleri hesaplamanıza yardımcı olan bir şey açıkça "iş mantığı" dır.

Bu daha çok bir sürüm kontrolü sorunudur ve bu kediyi kaplamanın birçok yolu vardır. Maven (ve bir dereceye kadar Phing / Ant) gibi araçlar , bir çeşit harici yapılandırma dosyasına (genellikle XML) dayalı olarak çeşitli, farklı kaynaklardan gelen uygulamaları birleştirmek için üretilmiştir . Bu, kütüphane kodu için ayrı depolar tutabileceğiniz ve gerekiyorsa Uygulama X'e aktarabileceğiniz anlamına gelir .

Ana makineniz üzerinde denetiminiz varsa, kitaplık öğelerini ekleme yoluna taşımayı düşünebilir ve bunu uzun vadeli ayrı bir proje olarak koruyabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.