Configurarea containerului DI
Prezentare generală a opțiunilor de configurare pentru containerul Nette DI.
Fișier de configurare
Containerul Nette DI este ușor de controlat cu ajutorul fișierelor de configurare. Acestea sunt de obicei scrise în format NEON. Pentru editare, vă recomandăm să folosiți editoare cu suport pentru acest format.
decorator: Decorator
di: DI Container
extensions: Instalați extensii DI suplimentare
includes: Fișiere de includere
parameters: Parametrii
search: Înregistrare automată a serviciilor
services: Servicii
Pentru a scrie un șir care conține caracterul %
, you must escape it by doubling it to
%%
.
Parametrii
Puteți defini parametrii care pot fi apoi utilizați ca parte a definițiilor serviciilor. Acest lucru poate ajuta la separarea valorilor pe care veți dori să le modificați mai regulat.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
Puteți face referire la parametrul foo
prin intermediul %foo%
în altă parte în orice fișier de
configurare. De asemenea, pot fi utilizați în interiorul unor șiruri de caractere precum '%wwwDir%/images'
.
Parametrii nu trebuie să fie doar șiruri de caractere, ci și valori de tip array:
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
Vă puteți referi la o singură cheie ca %mailer.user%
.
Dacă aveți nevoie să obțineți valoarea unui parametru în codul dumneavoastră, de exemplu în clasa dumneavoastră, atunci treceți-l în această clasă. De exemplu, în constructor. Nu există un obiect de configurare globală care să poată fi interogat de clase pentru valorile parametrilor. Acest lucru ar fi contrar principiului de injectare a dependențelor.
Servicii
A se vedea capitolul separat.
Decorator
Cum se pot edita în bloc toate serviciile de un anumit tip? Aveți nevoie să apelați o anumită metodă pentru toți prezentatorii care moștenesc de la un anumit strămoș comun? De aici vine decoratorul.
decorator:
# pentru toate serviciile care sunt instanțe ale acestei clase sau interfețe
App\UI\BasePresenter:
setup:
- setProjectId(10) # apelează această metodă
- $absoluteUrls = true # și setează variabila
Decoratorul poate fi utilizat și pentru a seta etichete sau pentru a activa modul de injectare.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
Setări tehnice ale containerului DI.
di:
# arată DIC în Tracy Bar?
debugger: ... # (bool) valoarea implicită este true
# tipuri de parametri pe care nu îi conectați niciodată automat
excluded: ... # (string[])
# clasa din care moștenește containerul DI
parentClass: ... # (string) valoarea implicită este Nette\DI\Container
Exportul de metadate
Clasa container DI conține, de asemenea, o mulțime de metadate. Puteți să le reduceți prin reducerea exportului de metadate.
di:
export:
# pentru a exporta parametrii?
parameters: false # (bool) valoarea implicită este true
# să exporte etichete și care dintre ele?
tags: # (string[]|bool) implicit toate
- event.subscriber
# exportă date pentru autocablare și care?
types: # (string[]|bool) implicit toate
- Nette\Database\Connection
- Symfony\Component\Console\Application
Dacă nu utilizați matricea $container->getParameters()
, puteți dezactiva exportul de parametri. În plus,
puteți exporta numai acele etichete prin care obțineți servicii utilizând metoda $container->findByTag(...)
.
Dacă nu apelați deloc metoda, puteți dezactiva complet exportul de etichete cu false
.
Puteți reduce în mod semnificativ metadatele pentru cablarea automată prin specificarea claselor pe care le
utilizați ca parametru pentru metoda $container->getByType()
. Și, din nou, dacă nu apelați deloc metoda (sau
doar în bootstrap pentru a obține
Nette\Application\Application
), puteți dezactiva complet exportul cu false
.
Extensii
Înregistrarea altor extensii DI. În acest fel, adăugăm, de exemplu, extensia DI
Dibi\Bridges\Nette\DibiExtension22
sub numele dibi
:
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
Apoi o configurăm în secțiunea sa numită tot dibi
:
dibi:
host: localhost
De asemenea, puteți adăuga o clasă de extensie cu parametri:
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
Includerea fișierelor
Fișiere de configurare suplimentare pot fi inserate în secțiunea includes
:
includes:
- parameters.php
- services.neon
- presenters.neon
Numele parameters.php
nu este o greșeală de tipar, configurația poate fi scrisă și într-un fișier PHP,
care o returnează sub formă de matrice:
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
În cazul în care în fișierele de configurare apar elemente cu aceleași chei, acestea vor fi suprascrise sau fuzionate în cazul array-urilor. Ultimul fișier inclus are o prioritate mai mare decât
cel anterior. Fișierul în care este listată secțiunea includes
are o prioritate mai mare decât fișierele
incluse în el.
Căutare
Adăugarea automată a serviciilor în containerul DI face munca extrem de plăcută. Nette adaugă automat prezentatorii la container, dar puteți adăuga cu ușurință orice alte clase.
Trebuie doar să specificați în ce directoare (și subdirectoare) trebuie căutate clasele:
search:
- in: %appDir%/Forms
- in: %appDir%/Model
De obicei, însă, nu dorim să adăugăm toate clasele și interfețele, așa că le putem filtra:
search:
- in: %appDir%/Forms
# filtrarea după numele fișierului (string|string[])
files:
- *Factory.php
# filtrarea după numele clasei (string|string[])
classes:
- *Factory
Sau putem selecta clasele care moștenesc sau implementează cel puțin una dintre următoarele clase:
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
De asemenea, se pot defini reguli negative, adică măști de nume de clasă sau strămoși, iar dacă acestea sunt conforme, serviciul nu va fi adăugat la containerul DI:
search:
- in: %appDir%
exclude:
fișiere: ...
classes: ...
extends: ...
implements: ...
Se pot stabili etichete pentru serviciile adăugate:
search:
- in: %appDir%
tags: ...
Fuziune
În cazul în care elemente cu aceleași chei apar în mai multe fișiere de configurare, acestea vor fi suprascrise sau fuzionate, în cazul tablourilor. Ultimul fișier inclus are o prioritate mai mare.
config1.neon | config2.neon | rezultat |
---|---|---|
|
|
|
Pentru a împiedica fuzionarea unei anumite matrice, utilizați semnul exclamării imediat după numele matricei:
config1.neon | config2.neon | rezultat |
---|---|---|
|
|
|