Modüller
Nette'de modüller bir uygulamayı oluşturan mantıksal birimleri temsil eder. Sunucuları, şablonları, muhtemelen bileşenleri ve model sınıflarını içerirler.
Sunucular için bir dizin ve şablonlar için bir dizin gerçek projeler için yeterli olmayacaktır. Bir klasörde düzinelerce dosya olması en azından düzensizdir. Bundan nasıl kurtulabiliriz? Basitçe onları diskteki alt dizinlere ve koddaki ad alanlarına böleriz. Nette modüllerinin yaptığı da tam olarak budur.
Sunucular ve şablonlar için tek bir klasör oluşturmayı unutalım ve bunun yerine örneğin Admin
ve
Front
gibi modüller oluşturalım.
app/ ├──Presenters/├── Modules/ ← directory with modules │ ├── Admin/ ← module Admin │ │ ├── Presenters/ ← its presenters │ │ │ ├── DashboardPresenter.php │ │ │ └── templates/ │ └── Front/ ← module Front │ └── Presenters/ ← its presenters │ └── ...
Bu dizin yapısı sınıf ad alanları tarafından yansıtılacaktır, bu nedenle örneğin DashboardPresenter
App\Modules\Admin\Presenters
ad alanında olacaktır:
namespace App\Modules\Admin\Presenters;
class DashboardPresenter extends Nette\Application\UI\Presenter
{
// ...
}
Admin
modülü içindeki Dashboard
sunumcusuna uygulama içinde iki nokta üst üste gösterimi
kullanılarak Admin:Dashboard
şeklinde ve default
eylemine Admin:Dashboard:default
şeklinde referans verilir. Peki Nette proper Admin:Dashboard
'un
App\Modules\Admin\Presenters\DashboardPresenter
sınıfını temsil ettiğini nasıl biliyor? Bu, yapılandırmadaki
eşleme ile belirlenir. Bu nedenle, verilen yapı sabit değildir ve ihtiyaçlarınıza göre
değiştirebilirsiniz.
Modüller elbette sunum yapanların ve şablonların yanı sıra bileşenler, model sınıfları vb. gibi diğer tüm öğeleri de içerebilir.
İç İçe Modüller
Modüller sadece düz bir yapı oluşturmak zorunda değildir, örneğin alt modüller de oluşturabilirsiniz:
app/ ├── Modules/ ← directory with modules │ ├── Blog/ ← module Blog │ │ ├── Admin/ ← submodule Admin │ │ │ ├── Presenters/ │ │ │ └── ... │ │ └── Front/ ← submodule Front │ │ ├── Presenters/ │ │ └── ... │ ├── Forum/ ← module Forum │ │ └── ...
Böylece, Blog
modülü Admin
ve Front
alt modüllerine bölünmüştür. Yine, bu durum
App\Modules\Blog\Admin\Presenters
vb. isim alanlarına da yansıyacaktır. Alt modülün içindeki
Dashboard
sunucusu Blog:Admin:Dashboard
olarak adlandırılır.
İç içe geçme istediğiniz kadar derin olabilir, böylece alt alt modüller oluşturulabilir.
Bağlantı Oluşturma
Sunucu şablonlarındaki bağlantılar geçerli modüle görelidir. Bu nedenle, Foo:default
bağlantısı geçerli
sunum yapan kişiyle aynı modülde bulunan Foo
sunum yapan kişiye yönlendirir. Örneğin, geçerli modül
Front
ise, bağlantı şu şekilde olur:
<a n:href="Product:show">link to Front:Product:show</a>
Bir bağlantı, bir modülün adını içerse bile görelidir ve bu durumda bir alt modül olarak kabul edilir:
<a n:href="Shop:Product:show">link to Front:Shop:Product:show</a>
Mutlak bağlantılar diskteki mutlak yollara benzer şekilde yazılır, ancak eğik çizgiler yerine iki nokta üst üste konur. Böylece, mutlak bir bağlantı iki nokta üst üste ile başlar:
<a n:href=":Admin:Product:show">link to Admin:Product:show</a>
Belirli bir modülde mi yoksa onun alt modülünde mi olduğumuzu öğrenmek için isModuleCurrent(moduleName)
fonksiyonunu kullanabiliriz.
<li n:class="isModuleCurrent('MyEshop:Users') ? active">
<a n:href="Product:">...</a>
</li>
Yönlendirme
Yönlendirme ile ilgili bölüme bakın.
Haritalama
Sınıf adının sunum yapan kişinin adından türetildiği kuralları tanımlar. Bunları yapılandırmada application › mapping
anahtarının
altına yazıyoruz.
Modül kullanmayan bir örnekle başlayalım. Sadece sunum yapan sınıfların App\Presenters
ad alanına sahip
olmasını isteyeceğiz. Bu, Home
gibi bir sunucunun App\Presenters\HomePresenter
sınıfıyla
eşleşmesi gerektiği anlamına gelir. Bu, aşağıdaki yapılandırma ile gerçekleştirilebilir:
application:
mapping:
*: App\Presenters\*Presenter
Sunum yapan kişinin adı sınıf maskesindeki yıldız işaretiyle değiştirilir ve sonuç sınıf adı olur. Kolay!
Sunum yapanları modüllere ayırırsak, her modül için kendi eşlememizi yapabiliriz:
application:
mapping:
Front: App\Modules\Front\Presenters\*Presenter
Admin: App\Modules\Admin\Presenters\*Presenter
Api: App\Api\*Presenter
Şimdi Front:Home
sunucusu App\Modules\Front\Presenters\HomePresenter
sınıfıyla ve
Admin:Dashboard
sunucusu App\Modules\Admin\Presenters\DashboardPresenter
sınıfıyla eşleşir.
İlk ikisini değiştirmek için genel bir (yıldız) kural oluşturmak daha pratiktir. Ekstra yıldız işareti sadece modül için sınıf maskesine eklenecektir:
application:
mapping:
*: App\Modules\*\Presenters\*Presenter
Api: App\Api\*Presenter
Peki ya iç içe modüller kullanıyorsak ve bir sunumcumuz varsa Admin:User:Edit
? Bu durumda, her seviye için
modülü temsil eden yıldız işaretli bölüm basitçe tekrarlanır ve sonuç
App\Modules\Admin\User\Presenters\EditPresenter
sınıfı olur.
Alternatif bir gösterim, bir dize yerine üç segmentten oluşan bir dizi kullanmaktır. Bu gösterim bir öncekine eşdeğerdir:
application:
mapping:
*: [App\Modules, *, Presenters\*Presenter]
Varsayılan değer *: *Module\*Presenter
'dur.