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.

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.

versiyon: 4.0