Modüller
Modüller, mantıksal birimlere kolayca bölünmeyi kolaylaştırarak Nette uygulamalarına netlik kazandırır.
Dosyaları sabit diskte klasörler halinde düzenlemeye benzer şekilde, Nette'de sunum yapan kişileri, şablonları ve diğer yardımcı sınıfları modüllere bölebiliriz. Bu pratikte nasıl çalışır? Basitçe yapıya yeni alt dizinler ekleyerek. İşte Front ve Admin olmak üzere iki modüllü bir yapı örneği:
app/ ├── UI/ │ ├── Admin/ ← Admin module │ │ ├── @layout.latte │ │ ├── Dashboard/ │ │ │ ├── DashboardPresenter.php │ │ │ └── default.latte │ │ └── ... │ ├── Front/ ← Front module │ │ ├── @layout.latte │ │ ├── Home/ │ │ │ ├── HomePresenter.php │ │ │ └── default.latte │ │ └── ...
Bu dizin yapısı sınıfların isim alanlarına da yansıtılır; örneğin DashboardPresenter
,
App\UI\Admin\Dashboard
isim alanında yer alır:
namespace App\UI\Admin\Dashboard;
class DashboardPresenter extends Nette\Application\UI\Presenter
{
// ...
}
Uygulamada, Admin
modülü içindeki Dashboard
sunumcusuna iki nokta üst üste gösterimini
kullanarak Admin:Dashboard
olarak atıfta bulunuyoruz. default
eylemi için
Admin:Dashboard:default
olarak adlandırıyoruz.
Sunulan yapı katı değildir; yapılandırmada ihtiyaçlarınıza göre tamamen özelleştirebilirsiniz.
Modüller, sunucular ve şablonların yanı sıra bileşenler ve yardımcı sınıflar gibi diğer tüm dosyaları da
içerebilir. Bunları nereye yerleştireceğinizi düşünüyorsanız, bir Accessory
klasörü kullanmayı
düşünün:
app/ ├── UI/ │ ├── Admin/ │ │ ├── Accessory/ │ │ │ ├── FormFactory.php │ │ │ └── AdminLayout.php │ │ ├── Dashboard/ │ │ └── ...
İç İçe Modüller
Modüller, diskteki bir dizin yapısına benzer şekilde birden fazla iç içe geçme seviyesine sahip olabilir:
app/ ├── UI/ │ ├── Blog/ ← Blog module │ │ ├── Admin/ ← Admin submodule │ │ │ ├── Dashboard/ │ │ │ └── ... │ │ ├── Front/ ← Front submodule │ │ │ ├── @layout.latte │ │ │ ├── Home/ │ │ │ └── ... │ ├── Forum/ ← Forum module │ │ └── ...
Blog
modülü Admin
ve Front
alt modüllerine ayrılmıştır. Bu aynı zamanda
App\UI\Blog\Admin
ve benzer şekilde görünen isim alanlarına da yansıtılır. Admin
alt modülü
içindeki Dashboard
sunucusuna atıfta bulunmak için, bunu Blog:Admin:Dashboard
olarak
adlandırıyoruz.
Yerleştirme, alt alt modüllerin oluşturulmasına izin vererek gerektiği kadar derin olabilir.
Örneğin, yönetimde OrderDetail
, OrderEdit
, OrderDispatch
, vb. gibi sipariş
yönetimiyle ilgili birçok sunucunuz varsa, Detail
, Edit
, Dispatch
ve diğerleri gibi
sunucuların düzenleneceği bir Order
modülü oluşturabilirsiniz.
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
Eşleme, sınıf adının sunum yapan kişinin adından türetilmesine ilişkin kuralları tanımlar. Bu kurallar yapılandırmada application › mapping
anahtarı altında belirtilir.
Bu sayfada daha önce bahsedilen dizin yapıları aşağıdaki eşleştirmeye dayanmaktadır:
application:
mapping: App\UI\*\**Presenter
Eşleme nasıl çalışır? Daha iyi anlamak için öncelikle modülsüz bir uygulama hayal edelim. Sunucu sınıflarının
App\UI
ad alanı altında olmasını istiyoruz, böylece Home
sunucusu App\UI\HomePresenter
sınıfıyla eşleşir. Bu, şu yapılandırma ile gerçekleştirilebilir:
application:
mapping: App\UI\*Presenter
Bu eşleme, App\UI\*Presenter
maskesindeki yıldız işaretini Home
sunum yapan kişi adıyla
değiştirerek çalışır ve sonuçta App\UI\HomePresenter
nihai sınıf adı elde edilir. Çok basit!
Ancak, bu ve diğer bölümlerdeki örneklerde görebileceğiniz gibi, sunum yapan sınıfları isimsiz alt dizinlere
yerleştiriyoruz, örneğin, Home
sunum yapan App\UI\Home\HomePresenter
sınıfıyla
eşleştirilmiştir. Bu, yıldız işaretinin iki katına çıkarılmasıyla elde edilir (Nette Application 3.2 gerektirir):
application:
mapping: App\UI\**Presenter
Şimdi, sunum yapan kişileri modüllerle eşleştirmeye geçelim. Her modül için özel eşlemeler tanımlayabiliriz:
application:
mapping:
Front: App\UI\Front\**Presenter
Admin: App\UI\Admin\**Presenter
Api: App\Api\*Presenter
Bu yapılandırmaya göre, Front:Home
sunucusu App\UI\Front\Home\HomePresenter
sınıfıyla
eşleşirken, Api:OAuth
sunucusu App\Api\OAuthPresenter
sınıfıyla eşleşir.
Front
ve Admin
modülleri benzer bir eşleme yaklaşımına sahip olduğundan ve bu türden daha
fazla modül olması muhtemel olduğundan, bunların yerini alan genel bir kural oluşturmak mümkündür. Sınıf maskesine
modül için yeni bir yıldız işareti eklenir:
application:
mapping:
*: App\UI\*\**Presenter
Api: App\Api\*Presenter
Sunum yapan kişi Admin:User:Edit
gibi çok seviyeli iç içe modüller için yıldız işareti segmenti her
seviye için tekrarlanır ve App\UI\Admin\User\Edit\EditPresenter
sınıfı ortaya çıkar.
Alternatif bir gösterim, dize yerine üç segmentten oluşan bir dizi kullanmaktır. Bu gösterim bir öncekine eşdeğerdir:
application:
mapping:
*: [App\UI, *, **Presenter]
Api: [App\Api, '', *Presenter]
Konfigürasyonda sadece bir kuralımız varsa, genel olanı, kısaca yazabiliriz:
application:
mapping: App\UI\*\**Presenter