DI Konteyner Yapılandırması
Nette DI konteyneri için yapılandırma seçeneklerine genel bakış.
Yapılandırma Dosyası
Nette DI konteyneri, yapılandırma dosyaları aracılığıyla kolayca kontrol edilir. Bunlar genellikle NEON formatı kullanılarak yazılır. Düzenleme için bu formatı destekleyen düzenleyiciler öneririz.
decorator: Dekoratör
di: DI konteyner
extensions: Diğer DI uzantılarının kurulumu
includes: Dosya dahil etme
parameters: Parametreler
search: Servislerin otomatik kaydı
services: Servisler
%
karakterini içeren bir karakter dizisi yazmak istiyorsanız, onu %%
olarak iki
katına çıkararak kaçış yapmanız gerekir.
Parametreler
Yapılandırmada, daha sonra servis tanımlarının bir parçası olarak kullanılabilecek parametreler tanımlayabilirsiniz. Bu sayede yapılandırmayı daha anlaşılır hale getirebilir veya değişecek değerleri birleştirebilir ve ayırabilirsiniz.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
dsn
parametresine yapılandırmanın herhangi bir yerinde %dsn%
yazarak başvururuz. Parametreler,
'%wwwDir%/images'
gibi karakter dizileri içinde de kullanılabilir.
Parametreler yalnızca karakter dizileri veya sayılar olmak zorunda değildir, diziler de içerebilirler:
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
Belirli bir anahtara %mailer.user%
olarak başvururuz.
Kodunuzda, örneğin bir sınıfta, herhangi bir parametrenin değerini öğrenmeniz gerekiyorsa, onu bu sınıfa aktarın. Örneğin kurucuda. Parametre değerleri için sınıfların sorgulayacağı, yapılandırmayı temsil eden global bir nesne yoktur. Bu, bağımlılık enjeksiyonu ilkesinin ihlali olurdu.
Servisler
Bkz. ayrı bölüm.
Dekoratör (Decorator)
Belirli bir tipteki tüm servisleri toplu olarak nasıl düzenlersiniz? Örneğin, belirli bir ortak atadan kalıtım alan tüm presenter'larda belirli bir metodu çağırmak? İşte bunun için dekoratör var.
decorator:
# bu sınıfın veya arayüzün örneği olan tüm servislerde
App\Presentation\BasePresenter:
setup:
- setProjectId(10) # bu metodu çağır
- $absoluteUrls = true # ve değişkeni ayarla
Dekoratör ayrıca etiketleri ayarlamak veya inject modunu açmak için de kullanılabilir.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
DI konteynerinin teknik ayarları.
di:
# DIC'yi Tracy Bar'da göster?
debugger: ... # (bool) varsayılan true'dur
# asla otomatik bağlanmayacak parametre tipleri
excluded: ... # (string[])
# servislerin tembel oluşturulmasına izin ver?
lazy: ... # (bool) varsayılan false'dur
# DI konteynerinin kalıtım aldığı sınıf
parentClass: ... # (string) varsayılan Nette\DI\Container'dır
Tembel Servisler
lazy: true
ayarı, servislerin tembel (ertelenmiş) oluşturulmasını etkinleştirir. Bu, servislerin DI
konteynerinden talep edildiği anda değil, ilk kullanıldıkları anda gerçekten oluşturulduğu anlamına gelir. Bu,
uygulamanın başlangıcını hızlandırabilir ve bellek gereksinimlerini azaltabilir, çünkü yalnızca ilgili istekte
gerçekten ihtiyaç duyulan servisler oluşturulur.
Belirli bir servis için tembel oluşturma değiştirilebilir.
Tembel nesneler yalnızca kullanıcı sınıfları için kullanılabilir, dahili PHP sınıfları için kullanılamaz. PHP 8.4 veya daha yenisini gerektirir.
Meta Veri Dışa Aktarma
DI konteyner sınıfı ayrıca birçok meta veri içerir. Meta veri dışa aktarımını azaltarak onu küçültebilirsiniz.
di:
export:
# parametreleri dışa aktar?
parameters: false # (bool) varsayılan true'dur
# etiketleri ve hangilerini dışa aktar?
tags: # (string[]|bool) varsayılan hepsi
- event.subscriber
# otomatik bağlama için verileri ve hangilerini dışa aktar?
types: # (string[]|bool) varsayılan hepsi
- Nette\Database\Connection
- Symfony\Component\Console\Application
Eğer $container->getParameters()
dizisini kullanmıyorsanız, parametre dışa aktarımını kapatabilirsiniz.
Ayrıca, yalnızca $container->findByTag(...)
metoduyla servis aldığınız etiketleri dışa aktarabilirsiniz.
Eğer metodu hiç çağırmıyorsanız, etiket dışa aktarımını false
ile tamamen kapatabilirsiniz.
$container->getByType()
metodunun parametresi olarak kullandığınız sınıfları belirterek otomatik bağlama için meta veriyi önemli ölçüde
azaltabilirsiniz. Ve yine, eğer metodu hiç çağırmıyorsanız (veya yalnızca Nette\Application\Application
almak
için bootstrap içinde çağırıyorsanız), dışa aktarımı
false
ile tamamen kapatabilirsiniz.
Uzantılar
Diğer DI uzantılarının kaydı. Bu şekilde örneğin Dibi\Bridges\Nette\DibiExtension22
DI uzantısını
dibi
adı altında ekleriz
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
Daha sonra onu dibi
bölümünde yapılandırırız:
dibi:
host: localhost
Parametreleri olan bir sınıf da uzantı olarak eklenebilir:
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
Dosya Dahil Etme
Diğer yapılandırma dosyalarını includes
bölümüne ekleyebiliriz:
includes:
- parameters.php
- services.neon
- presenters.neon
parameters.php
adı bir yazım hatası değildir, yapılandırma PHP dosyasında da yazılabilir ve bir dizi
olarak döndürülebilir:
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
Yapılandırma dosyalarında aynı anahtarlara sahip öğeler görünürse, üzerine yazılır veya diziler durumunda birleştirilir. Daha sonra dahil edilen dosya, öncekinden daha yüksek önceliğe
sahiptir. includes
bölümünün belirtildiği dosya, içine dahil edilen dosyalardan daha yüksek önceliğe
sahiptir.
Arama (Search)
Servislerin DI konteynerine otomatik olarak eklenmesi işi son derece keyifli hale getirir. Nette, presenter'ları otomatik olarak konteynere ekler, ancak diğer herhangi bir sınıfı da kolayca eklemek mümkündür.
Sadece hangi dizinlerde (ve alt dizinlerde) sınıfları araması gerektiğini belirtmek yeterlidir:
search:
- in: %appDir%/Forms
- in: %appDir%/Model
Ancak genellikle tüm sınıfları ve arayüzleri eklemek istemeyiz, bu yüzden onları filtreleyebiliriz:
search:
- in: %appDir%/Forms
# dosya adına göre filtreleme (string|string[])
files:
- *Factory.php
# sınıf adına göre filtreleme (string|string[])
classes:
- *Factory
Veya belirtilen sınıflardan en az birini kalıtım alan veya uygulayan sınıfları seçebiliriz:
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
Ayrıca dışlama kuralları da tanımlanabilir, yani sınıf adı maskeleri veya kalıtımsal atalar, eğer uyuyorsa servis DI konteynerine eklenmez:
search:
- in: %appDir%
exclude:
files: ...
classes: ...
extends: ...
implements: ...
Tüm servislere etiketler atanabilir:
search:
- in: %appDir%
tags: ...
Birleştirme
Birden fazla yapılandırma dosyasında aynı anahtarlara sahip öğeler görünürse, üzerine yazılır veya diziler durumunda birleştirilir. Daha sonra dahil edilen dosya, öncekinden daha yüksek önceliğe sahiptir.
config1.neon | config2.neon | sonuç |
---|---|---|
|
|
|
Dizilerde, anahtar adından sonra ünlem işareti belirterek birleştirmeyi önleyebilirsiniz:
config1.neon | config2.neon | sonuç |
---|---|---|
|
|
|