DI Konteynerini Yapılandırma
Nette DI konteyneri için yapılandırma seçeneklerine genel bakış.
Yapılandırma dosyası
Nette DI konteynerinin yapılandırma dosyaları kullanılarak kontrol edilmesi kolaydır. Genellikle NEON formatında yazılırlar. Düzenleme için bu formatı destekleyen editörler kullanmanızı öneririz.
decorator: Dekoratör
di: DI Konteyner
extensions: Ek DI uzantılarını yükleyin
includes: Including files
parameters: Parameters
search: Otomatik hizmet kaydı
services: Services
%
, you must escape it by doubling it to %%
karakterini içeren bir dize
yazmak için.
Parametreler
Daha sonra hizmet tanımlarının bir parçası olarak kullanılabilecek parametreler tanımlayabilirsiniz. Bu, daha düzenli olarak değiştirmek isteyeceğiniz değerleri ayırmanıza yardımcı olabilir.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
Herhangi bir yapılandırma dosyasının başka bir yerinde %foo%
aracılığıyla foo
parametresine
başvurabilirsiniz. Ayrıca '%wwwDir%/images'
gibi dizgilerin içinde de kullanılabilirler.
Parametrelerin sadece string olması gerekmez, dizi değerleri de olabilirler:
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
Tek tuşa %mailer.user%
olarak başvurabilirsiniz.
Kodunuzda, örneğin sınıfınızda herhangi bir parametrenin değerini almanız gerekiyorsa, o zaman bu sınıfa geçirin. Örneğin, yapıcıda. Sınıfların parametre değerlerini sorgulayabileceği global bir yapılandırma nesnesi yoktur. Bu, bağımlılık enjeksiyonu ilkesine aykırı olacaktır.
Hizmetler
Ayrı bir bölüme bakınız.
Dekoratör
Belirli bir türdeki tüm hizmetleri toplu olarak nasıl düzenleyebilirim? Belirli bir ortak atadan miras kalan tüm sunucular için belirli bir yöntemi çağırmanız mı gerekiyor? İşte dekoratörün geldiği yer burasıdır.
decorator:
# bu sınıfın veya arayüzün örneği olan tüm hizmetler için
App\UI\BasePresenter:
setup:
- setProjectId(10) # bu yöntemi çağır
- $absoluteUrls = true # ve değişkeni ayarlayın
Dekoratör ayrıca etiketleri ayarlamak veya enjeksiyon modunu açmak için de kullanılabilir.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
DI konteynerinin teknik ayarları.
di:
# Tracy Bar'da DIC gösteriyor mu?
debugger: ... # (bool) varsayılan değer true
# asla otomatik bağlamadığınız parametre türleri
excluded: ... # (string[])
# DI konteynerinin miras aldığı sınıf
parentClass: ... # (string) varsayılan olarak Nette\DI\Container
Meta Veri Aktarımı
DI konteyner sınıfı ayrıca çok fazla meta veri içerir. Meta veri dışa aktarımını azaltarak bunu azaltabilirsiniz.
di:
export:
# parametreleri dışa aktarmak için?
parameters: false # (bool) varsayılan değer true
# etiketleri dışa aktarın ve hangileri?
tags: # (string[]|bool) varsayılan tüm
- event.subscriber
# otomatik kablolama için verileri dışa aktar ve hangisi?
types: # (string[]|bool) varsayılan tüm
- Nette\Database\Connection
- Symfony\Component\Console\Application
$container->getParameters()
dizisini kullanmıyorsanız, parametre dışa aktarımını devre dışı
bırakabilirsiniz. Ayrıca, yalnızca $container->findByTag(...)
yöntemini kullanarak hizmet aldığınız
etiketleri dışa aktarabilirsiniz. Yöntemi hiç çağırmazsanız, false
ile etiket dışa aktarımını tamamen
devre dışı bırakabilirsiniz.
Kullandığınız sınıfları $container->getByType()
yöntemine parametre olarak belirterek otomatik kablolama için meta verileri önemli ölçüde
azaltabilirsiniz. Ve yine, yöntemi hiç çağırmazsanız (veya Nette\Application\Application
adresini almak için
yalnızca bootstrap içinde çağırırsanız), false
ile dışa aktarmayı tamamen devre dışı bırakabilirsiniz.
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 dibi
adlı bölümde yapılandırıyoruz:
dibi:
host: localhost
Parametreli bir uzantı sınıfı da ekleyebilirsiniz:
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
Dosyalar Dahil
Ek yapılandırma dosyaları includes
bölümüne eklenebilir:
includes:
- parameters.php
- services.neon
- presenters.neon
parameters.php
adı bir yazım hatası değildir, yapılandırma bir dizi olarak döndüren bir PHP dosyasına da
yazılabilir:
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
Aynı anahtarlara sahip öğeler yapılandırma dosyalarında görünürse, diziler söz konusu olduğunda bunların üzerine yazılır veya birleştirilir. Daha sonra dahil edilen dosyanın bir öncekinden daha yüksek
önceliği vardır. includes
bölümünün listelendiği dosya, içine dahil edilen dosyalardan daha yüksek
önceliğe sahiptir.
Arama
Hizmetlerin DI konteynerine otomatik olarak eklenmesi, çalışmayı son derece keyifli hale getirir. Nette, kapsayıcıya otomatik olarak sunucuları ekler, ancak diğer sınıfları kolayca ekleyebilirsiniz.
Sınıfların hangi dizinlerde (ve alt dizinlerde) aranması gerektiğini belirtmeniz 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
Ya da aşağıdaki sınıflardan en az birini miras alan veya uygulayan sınıfları seçebiliriz:
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
Ayrıca negatif kurallar da tanımlayabilirsiniz, yani sınıf adı maskeleri veya ataları ve bunlara uymaları halinde hizmet DI konteynerine eklenmeyecektir:
search:
- in: %appDir%
exclude:
dosyalar: ...
classes: ...
extends: ...
implements: ...
Eklenen hizmetler için etiketler belirlenebilir:
search:
- in: %appDir%
tags: ...
Birleştirme
Aynı anahtarlara sahip öğeler daha fazla yapılandırma dosyasında görünüyorsa, diziler söz konusu olduğunda bunların üzerine yazılır veya birleştirilir. Daha sonra dahil edilen dosya daha yüksek önceliğe sahiptir.
config1.neon | config2.neon | Sonuç |
---|---|---|
|
|
|
Belirli bir dizinin birleştirilmesini önlemek için dizinin adından hemen sonra ünlem işareti kullanın:
config1.neon | config2.neon | Sonuç |
---|---|---|
|
|
|