DI Container Yapılandırması
Nette DI container'ının yapılandırma seçeneklerine genel bakış.
Yapılandırma Dosyası
Nette DI container, yapılandırma dosyalarıyla kolayca denetlenir. Bunlar genellikle NEON biçiminde yazılır. Bu biçim için destek sunan düzenleyicileri kullanmanızı öneririz.
decorator: Decorator
di: DI Container
extensions: Ek DI extension'ları kur
includes: Dosyaları dahil etme
parameters: Parametreler
search: Otomatik servis kaydı
services: Servisler
İçinde % karakteri geçen bir dize yazmak için onu iki katına çıkararak %%
biçiminde kaçışlamalısınız.
Parametreler
Yapılandırmada, sonra servis tanımlarının bir parçası olarak kullanabileceğiniz parametreler tanımlayabilirsiniz. Bu, yapılandırmayı netleştirmenizi ya da değişebilecek değerleri tek bir yerde toplamanızı sağlar.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
dsn parametresine yapılandırmanın herhangi bir yerinde %dsn% yazımıyla başvururuz. Parametreler
'%wwwDir%/images' gibi dizelerin içinde de kullanılabilir.
Parametreler yalnızca dize ya da sayı olmak zorunda değildir, dizi 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.
Kodunuzun (örneğin bir sınıfın) bir parametrenin değerine ihtiyacı varsa, onu sınıfa aktarın. Örneğin yapıcıda. Sınıfların parametre değerleri için sorgulayabileceği genel bir yapılandırma nesnesi yoktur. Bu, bağımlılık enjeksiyonu ilkesinin çiğnenmesi olurdu.
Servisler
Bkz. ayrı bölüm.
Decorator
Belirli bir türdeki birden çok servisi aynı anda nasıl değiştirirsiniz? Örneğin belirli bir temel sınıftan türeyen tüm presenter'larda belirli bir metot nasıl çağrılır? Decorator işte bunun içindir.
decorator:
# bu sınıfın ya da arayüzün örneği olan tüm servisler için
App\Presentation\BasePresenter:
setup:
- setProjectId(10) # bu metodu çağır
- $absoluteUrls = true # ve değişkeni ayarla
Decorator'lar etiket koymak ya da inject kipini açmak için de kullanılabilir.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
DI container'ının teknik ayarları.
di:
# DIC, Tracy Bar'da gösterilsin mi?
debugger: ... # (bool) varsayılan otomatik saptama (Tracy varsa açık)
# asla autowiring'e girmeyecek parametre türleri
excluded: ... # (string[])
# tembel servis oluşturma açık olsun mu?
lazy: ... # (bool) varsayılan false
# DI container'ın türeyeceği sınıf
parentClass: ... # (string) varsayılan Nette\DI\Container
Tembel Servisler
lazy: true ayarı, servislerin tembel (ertelenmiş) oluşturulmasını etkinleştirir. Yani servisler, DI
container'dan istendikleri anda değil, ilk kullanıldıkları anda oluşturulur. Bu, uygulamanın açılışını
hızlandırabilir ve bellek kullanımını azaltabilir; çünkü yalnızca ilgili istek için gerçekten gereken servisler
oluşturulur.
Belirli bir servis için tembel oluşturma ayarlanabilir.
Tembel nesneler yalnızca kullanıcı tanımlı sınıflarda kullanılabilir, PHP'nin iç sınıflarında kullanılamaz. PHP 8.4 ya da daha yenisini gerektirir.
Meta Veri Dışa Aktarımı
DI container sınıfı bolca meta veri de içerir. Meta veri dışa aktarımını azaltarak boyutunu küçültebilirsiniz.
di:
export:
# parametreler dışa aktarılsın mı?
parameters: false # (bool) varsayılan true
# etiketler dışa aktarılsın mı, hangileri?
tags: # (string[]|bool) varsayılan hepsi
- event.subscriber
# autowiring verileri dışa aktarılsın mı, hangileri?
types: # (string[]|bool) varsayılan hepsi
- Nette\Database\Connection
- Symfony\Component\Console\Application
$container->getParameters() kullanmıyorsanız parametre dışa aktarımını kapatabilirsiniz. Ayrıca
yalnızca $container->findByTag(...) ile servis almak için gerçekten kullandığınız etiketleri dışa
aktarabilirsiniz. Bu metodu hiç çağırmıyorsanız etiket dışa aktarımını false ile tümüyle
kapatabilirsiniz.
Autowiring için meta veriyi, yalnızca
$container->getByType() ile gerçekten istediğiniz sınıfları listeleyerek belirgin biçimde azaltabilirsiniz.
Yine, bu metodu hiç çağırmıyorsanız (ya da yalnızca bootstrap dosyasında, örneğin
Nette\Application\Application almak için çağırıyorsanız), tür dışa aktarımını false ile
tümüyle kapatabilirsiniz.
Extension'lar
Ek DI extension'larının kaydı. Örneğin Dibi\Bridges\Nette\DibiExtension3 DI extension'ını dibi
adıyla böyle eklersiniz:
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension3
Sonra onu dibi bölümünde yapılandırırsınız:
dibi:
host: localhost
Extension olarak parametreli bir sınıf da ekleyebilirsiniz:
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, [%appDir%], %tempDir%/cache)
Dosyaları Dahil Etme
Ek yapılandırma dosyaları includes bölümünde dahil edilebilir:
includes:
- parameters.php
- services.neon
- presenters.neon
parameters.php adı yazım hatası değil; yapılandırma, onu dizi olarak döndüren bir PHP dosyasında da
yazılabilir:
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
Birden çok yapılandırma dosyasında aynı anahtarlara sahip öğeler bulunursa, üzerleri yazılır ya da dizilerde birleştirilir. Sonra dahil edilen dosyanın önceliği öncekinden yüksektir. includes
bölümünün listelendiği dosyanın önceliği, içinde dahil edilen dosyalardan yüksektir.
Search
DI container'da servislerin otomatik kaydı geliştirmeyi belirgin biçimde kolaylaştırır. Nette presenter'ları container'a otomatik ekler, ama siz de başka herhangi bir sınıfı kolayca ekleyebilirsiniz.
Yalnızca sınıfların hangi dizinlerde (ve alt dizinlerinde) aranacağını belirtin:
search:
- in: %appDir%/Forms
- in: %appDir%/Model
Tek bir arama kuralına ihtiyacınız varsa listeyi atlayıp anahtarlarını doğrudan search altına
yazabilirsiniz:
search:
in: %appDir%
Ancak genellikle kesinlikle 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
Ya da listelenen sınıflardan en az birinden türeyen veya onu uygulayan sınıfları seçebiliriz:
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
Sınıf adı maskeleri ya da atalar kullanarak dışlama kuralları da tanımlayabilirsiniz. Bir sınıf dışlama kuralına uyarsa DI container'a eklenmez:
search:
- in: %appDir%
exclude:
files: ...
classes: ...
extends: ...
implements: ...
Otomatik kaydedilen tüm servislere etiket atanabilir:
search:
- in: %appDir%
tags: ...
Search, sınıfların yanı sıra tek bir create() ya da get() metodu olan arayüzleri de üretilen factory ya da accessor olarak kaydeder. Container'da
aynı türden bir servis zaten kayıtlıysa o sınıflar atlanır; böylece kopya oluşmaz.
Birleştirme
Birden çok yapılandırma dosyasında aynı anahtarlara sahip öğeler bulunursa, üzerleri yazılır ya da dizilerde birleştirilir. Sonra dahil edilen dosyanın önceliği öncekinden yüksektir.
| config1.neon | config2.neon | sonuç |
|---|---|---|
|
|
|
Dizilerde birleştirme, anahtar adından sonra bir ünlem işareti eklenerek önlenebilir:
| config1.neon | config2.neon | sonuç |
|---|---|---|
|
|
|