Çoklu Proje Geliştirme


    × Bunları biliyor muydunuz?
"Başlangıç kontrolcüsü tanımlayarak bu kontrolcüde yer alan kodların diğer tüm kontrolcüler için geçerli olmasını sağlayabilirsiniz."


ZN Framework kullanarak tek bir kurulum üzerinde birbiri ile bağlantılı ve de aynı zamanda bağımsız olarak çalışan birden fazla proje geliştirebilmeniz mümkündür. Eğer hostunuz birden fazla alan adı kullanımına izin veriyorsa, farklı alan adları (domain) ya da alt alan adları (subdomain) aynı yapı üzerinde çalıştırabilirsiniz. Ortak dosya kullanımları sayesinde tüm projeleriniz için aynı kütüphane, model, kaynak, dil, ayar dosyaları kullanarak, her proje için tekrar aynı dosya ve dizinleri kopyalama ya da yeniden yazmanıza gerek kalmaz.

 

 

# Yapılandırma


Aşağıda çoklu proje kullanımına yönelik ayarlar yer almaktadır.

Dosya: Settings/Projects.php
Projects
string $default = 'Frontend' Projects/ dizininde yer alan proje dizinlerinden hangisinin ön tanımlı olarak çalıştırılacağı bilgisidir.
array $others = [] Bu diziye hangi host adının hangi proje dizinini çalıştırılacağı belirtilir. Ancak host adı ile aynı isimli proje dizini kullanıyorsanız böyle bir tanımlama yapmanıza gerek yoktur. 
array $containers = [] Projelerden birini referans alarak diğer projelerin ana projeye bağlanabilmesini sağlamak amacıyla kullanılır. Yani alt projeler kendinde olmayan dizinlere ait dosyaları referans aldığı ana proje dizininden çeker.
 

 

# Projeler (ZN >= 3.1.3)


Projects/ dizi altında yer alan dizinleri kural olarak aşağıdaki gibi çağırabilirsiniz.

Kural: localhost/project

Aşağıdaki gibi bir proje dizin yapısına sahip olduğumuzu varsayarsak;

Projects/

Admin/

Forum/

Yukarıdaki gibi projeleriniz olduğunu varsayarsak bu dizinleri çalıştırmak için adres çubuğuna;

localhost/Admin/
localhost/Forum/

formatında yazılır. Bilmeniz gereken nokta bu dizinler fiziksel konum belirttiği için dizin isimleri rotalama işlemlerinde kullanılamazlar.

Takma İsim Kullanımı

Proje dizinlerine URL üzerinde kullanmak üzere takma isimler verebilirsiniz. Bunun için others ayarını aşağıdaki gibi düzenleyebilirsiniz.

'others'  =>
[
    'admin' => 'Admin',
    'forum' => 'Forum'
]

Bu ayarlardan sonra çalıştırmak için adres çubuğuna;

localhost/admin/
localhost/forum/

formatında yazıp çalıştırabilirsiniz.

Host Adı Kullanımı

Yapılandırma dosyasında yer alan others anahtarına takma isim belirtebildiğiniz gibi host ismi de belirtebilirsiniz. Bu farklı veya alt domain kullanımları için gereklidir. Şayet host adı ile aynı isme sahip dizin adı kullanıyorsanız aşağıdaki tanımlamayı yapmanıza gerek yoktur.

'others'  =>
[
    'subdomain.example.com' => 'SubdomainExample',
    'www.otherexample.com'  => 'OtherExample'
]

Yukarıda belirtilen hostların belirtilen dizini çalıştırabilmesi için yani farklı veya alt domainleri aynı sistem üzerinde kullanabilmeniz için her bir domain için oluşturulan httpd.conf dosyalarında yer alan apache'nin DocumentRoot değeri ZN'nin ana dizinini göstercek şekilde ayarlanması gerekmektedir. 

DocumentRoot "/var/www/vhost/zn/"
Uyarı: Hostunuzun çoklu domain desteği yoksa ve sunucu size ait değilse bu işlem gerçekleştirilemez.
Uyarı: Bir başka proje adı ile aynı isme sahip kontrolcü kullanılamaz.
Uyarı: Projects isimli kontrolcüye sahipseniz ajax isteklerinde Projects/ dizini içerisinde yer alan .htacces engellemesinden etkilenmemesi için küçük harf  projects olarak kullanmaya dikkat ediniz.

 

 

# Projeleri Birbirine Bağlama


Bir proje referans alınıp diğer projeler referans alınan projeya bağlanabilir. Böylece birden fazla proje bir projenın ortak dizinlerini kullanılır. Yani Frontend/ ve Backend/ dizinleri için Config/, Libraries/, Models/, Languages/, Resources/ gibi dizinlerin ortak olması istenirse yapılandırma dosyasında yer alan containers dizisi kullanılabilir.

Containers
array $containers = ['Backend' => 'Frontend'] Projelerden birini referans alarak diğer projelerin ana projeye bağlanabilmesini sağlamak amacıyla kullanılır. Yani alt projeler kendinde olmayan dizinlere ait dosyaları referans aldığı ana proje dizininden çeker.

Yukarıdaki ayardan anlaşılacağa üzere 2 proje sanki aynı dizindeymiş gibi çalıştırılabilir.

Modüler Projeler

Projects/Backend/ dizinine bakıldığında sadece Controllers/, Views/ ve Storage/ dizinlerinin olduğu görülür. Bu dizinin bu şekilde tasarlanımş olması Frontend/ dizini kapsamına alındığını gösterir. Yani Backend/ dizini içinde bulunmayan diğer tüm dizinlere ait dosyalar Frontend/ dizininden çekilmektedir. Bu kullanımın temel amacı aynı sistem üzerine birden fazla alt domain bağlamaktır. Her domain için aynı dosyaların tekrar kopyalamak yerine projeleri birbirine bağlayarak sizi ek dosya yükünden kurtarır. Aşağıda znframework.com'un proje dizinleri listelenmiştir.

Projects/

Frontend/

All Directories

Forum/

Controllers/
Views/
Resources/
Storage/

Docs/

Controllers/
Views/
Storage/

Api/

Controllers/
Views/

Devtools/

All Directories

Aşağıda yukarıdaki dizinlerin bazılarının birbiri ile nasıl bağlandığı gösterilmiştir.

'directory' =>
[
    'default' => 'Frontend'

    'others'  =>
    [
        'forum.znframework.com' => 'Forum',
        'docs.znframework.com'  => 'Docs',
        'api.znframework.com'   => 'Api'
    ]
],

'containers' => 
[
    'Forum' => 'Frontend',
    'Docs'  => 'Frontend',
    'Api'   => 'Frontend'
];

Yukarıdaki yapılandırmada görüldüğü üzere Frontend/ dizinine bağlanarak farklılık gösteren iç dizinler dışındaki diğer iç dizinlere yer verilmemiştir. Böylece aynı dizin ve dosyaların tek tek kopyalanması engellenmiş yapılan bir değişikliğin her birine tek tek uygulanmasının önüne geçilmiştir.

Modüler MVC

Projeleri bir birine bağlama özelliği sayesinde modüler mvc tasarımlarıda yapabilirsiniz. Bunun için yapmanız gereken modüler olarak oluşturuğunuz her bir dizinin Models-Views-Controllers dizinlerini içerecek şekilde çoğaltılması gerekmektedir. Aşağıda örnek yapılandırmaya yer verilmiştir.

Projects/

Home/

Products/

Models/
Views/
Controllers/

Appointments/

Models/
Views/
Controllers/

Yukarıdaki dizin yapılanmasında Home Frontend/ dizinin içerdiği dizinleri içerecek şekilde tasarlanıp bu dizine bağlanacak olan alt modüller sadece Models-Views-Controllers dizinlerini içerecek şekilde tasarlanmalıdır. Bu işlemden sonra containers yapılandırmasında şu düzenleme yapılmalıdır.

'directory' =>
[
    'default' => 'Home'

    'others'  =>
    [
        'products'     => 'Products',
        'appointments' => 'Appointments'
    ]
],

'containers' => 
[
    'Products'     => 'Home',
    'Appointments' => 'Home'
];

Yapılandırma dosyamızı diğer dizinlerin Home/ dizini kapsamında olduğunu belirtecek şekilde düzenledik.