Nette DI için Uzantı Oluşturma
DI konteynerinin oluşturulması, yapılandırma dosyalarının yanı sıra uzantılar olarak
adlandırılanlar tarafından da etkilenir. Bunları yapılandırma dosyasında extensions
bölümünde
etkinleştiririz.
Bu şekilde, BlogExtension
sınıfı tarafından temsil edilen uzantıyı blog
adı altında
ekleriz:
Her derleyici uzantısı Nette\DI\CompilerExtension'dan kalıtım alır ve DI konteynerinin oluşturulması sırasında sırayla çağrılan aşağıdaki metotları uygulayabilir:
- getConfigSchema()
- loadConfiguration()
- beforeCompile()
- afterCompile()
getConfigSchema()
Bu metot ilk olarak çağrılır. Yapılandırma parametrelerinin doğrulanması için şemayı tanımlar.
Uzantıyı, uzantının eklendiği adla aynı olan bölümde, yani blog
'da yapılandırırız:
Tipleri, izin verilen değerleri ve isteğe bağlı olarak varsayılan değerleri de dahil olmak üzere tüm yapılandırma seçeneklerini açıklayan bir şema oluştururuz:
Dokümantasyonu Schema sayfasında bulabilirsiniz. Ayrıca, dynamic()
kullanarak hangi seçeneklerin dinamik
olabileceğini belirleyebilirsiniz, örn. Expect::int()->dynamic()
.
Yapılandırmaya, bir stdClass
nesnesi olan $this->config
değişkeni aracılığıyla
erişiriz:
loadConfiguration()
Konteynere servis eklemek için kullanılır. Bunun için Nette\DI\ContainerBuilder kullanılır:
Kural, uzantı tarafından eklenen servisleri adıyla ön eklemektir, böylece isim çakışmaları olmaz. Bunu
prefix()
metodu yapar, yani uzantı adı blog
ise, servis blog.articles
adını taşır.
Bir servisi yeniden adlandırmamız gerekirse, geriye dönük uyumluluğu korumak için orijinal adla bir takma ad (alias)
oluşturabiliriz. Nette bunu benzer şekilde yapar, örn. önceki adı router
altında da mevcut olan
routing.router
servisi için.
Dosyadan Servis Yükleme
Servisleri yalnızca ContainerBuilder sınıfının API'sini kullanarak değil, aynı zamanda yapılandırma dosyasında
services
bölümünde kullanılan bilinen yazımla da oluşturabiliriz. @extension
ön eki mevcut
uzantıyı temsil eder.
Servisleri yükleriz:
beforeCompile()
Metot, konteynerin loadConfiguration
metotlarında bireysel uzantılar tarafından eklenen tüm servisleri ve
ayrıca kullanıcı yapılandırma dosyalarını içerdiği anda çağrılır. Bu derleme aşamasında, servis tanımlarını
düzenleyebilir veya aralarındaki bağlantıları tamamlayabiliriz. Konteynerdeki servisleri etiketlere göre aramak için
findByTag()
metodunu, sınıfa veya arayüze göre aramak için ise findByType()
metodunu
kullanabiliriz.
afterCompile()
Bu aşamada, konteyner sınıfı zaten bir ClassType nesnesi şeklinde üretilmiştir, servisleri oluşturan tüm metotları içerir ve önbelleğe yazılmaya hazırdır. Sonuç kodunu bu noktada hala düzenleyebiliriz.
$initialization
Configurator sınıfı, konteyner oluşturulduktan sonra
$this->initialization
nesnesine addBody() metodu
kullanılarak yazılan başlatma kodunu çağırır.
Örneğin, başlatma koduyla oturumu nasıl başlatacağımızı veya run
etiketine sahip servisleri nasıl
çalıştıracağımızı gösteren bir örnek: