Konfiguracija zabojnika DI
Pregled možnosti konfiguracije za zabojnik Nette DI.
Datoteka za konfiguracijo
Zabojnik Nette DI je mogoče preprosto upravljati s konfiguracijskimi datotekami. Običajno so zapisane v formatu NEON. Za urejanje priporočamo uporabo urejevalnikov s podporo za ta format.
decorator: Decorator
di: DI Container
extensions: Namesti dodatne razširitve DI
includes: Vključuje datoteke
parameters: Parametri
search: Samodejna registracija storitev
services: Storitve
Zapisovanje niza, ki vsebuje znak %
, you must escape it by doubling it to %%
.
Parametri
Opredelite lahko parametre, ki jih lahko nato uporabite kot del definicij storitev. To lahko pomaga pri ločevanju vrednosti, ki jih boste želeli bolj redno spreminjati.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
Na parameter foo
se lahko sklicujete prek %foo%
drugje v kateri koli konfiguracijski datoteki.
Uporabite jih lahko tudi znotraj nizov, kot je '%wwwDir%/images'
.
Parametri niso nujno samo nizi, lahko so tudi vrednosti v obliki polj:
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
Posamezen ključ lahko označite kot %mailer.user%
.
Če morate v kodi, na primer v razredu, dobiti vrednost katerega koli parametra, ga predajte temu razredu. Na primer v konstruktorju. Ni globalnega konfiguracijskega objekta, ki bi ga razredi lahko poizvedovali po vrednostih parametrov. To bi bilo v nasprotju z načelom vbrizgavanja odvisnosti.
Storitve
Glej posebno poglavje.
Dekorator
Kako množično urediti vse storitve določene vrste? Ali morate poklicati določeno metodo za vse predstavnike, ki dedujejo po določenem skupnem predniku? Od tod prihaja dekorator.
decorator:
# za vse storitve, ki so primerki tega razreda ali vmesnika.
App\UI\BasePresenter:
setup:
- setProjectId(10) # pokliče to metodo
- $absoluteUrls = true # in nastavi spremenljivko
Dekorator lahko uporabite tudi za nastavitev oznak ali vklop načina injiciranja.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
Tehnične nastavitve vsebnika DI.
di:
# prikazuje DIC v Tracy Baru?
debugger: ... # (bool) privzeto true
# vrste parametrov, ki jih nikoli ne povežete samodejno
excluded: ... # (string[])
# razred, iz katerega podeduje vsebnik DI
parentClass: ... # (string) privzeto Nette\DI\Container
Izvoz metapodatkov
Tudi razred vsebnika DI vsebuje veliko metapodatkov. Zmanjšate jih lahko tako, da zmanjšate izvoz metapodatkov.
di:
export:
# za izvoz parametrov?
parameters: false # (bool) privzeto true
# izvoziti oznake in katere?
tags: # (string[]|bool) privzeto so vsi
- event.subscriber
# izvozi podatke za samodejno napeljavo in katere?
types: # (string[]|bool) privzeto so vsi
- Nette\Database\Connection
- Symfony\Component\Console\Application
Če ne uporabljate polja $container->getParameters()
, lahko onemogočite izvoz parametrov. Poleg tega lahko
izvozite samo tiste oznake, prek katerih pridobivate storitve z uporabo metode $container->findByTag(...)
. Če
metode sploh ne kličete, lahko izvoz značk popolnoma onemogočite z metodo false
.
Metapodatke za samodejno vnašanje lahko bistveno zmanjšate tako, da razrede, ki jih uporabljate,
določite kot parameter metode $container->getByType()
. In še enkrat, če metode sploh ne pokličete (ali samo
v bootstrap, da dobite Nette\Application\Application
),
lahko izvoz popolnoma onemogočite s false
.
Razširitve
Registracija drugih razširitev DI. Tako na primer dodamo razširitev DI Dibi\Bridges\Nette\DibiExtension22
pod
imenom dibi
:
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
Nato jo konfiguriramo v njenem razdelku z imenom tudi dibi
:
dibi:
host: localhost
Dodate lahko tudi razširitveni razred s parametri:
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
Vključevanje datotek
Dodatne konfiguracijske datoteke lahko vstavite v razdelek includes
:
includes:
- parameters.php
- services.neon
- presenters.neon
Ime parameters.php
ni tipkarska napaka, konfiguracijo lahko zapišete tudi v datoteko PHP, ki jo vrne
kot polje:
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
Če se v konfiguracijskih datotekah pojavijo elementi z enakimi ključi, se prepišejo ali
združijo v primeru polj. Kasneje vključena datoteka ima višjo prioriteto kot prejšnja. Datoteka, v kateri je naveden
razdelek includes
, ima višjo prednost kot datoteke, ki so vanjo vključene.
Iskanje
Zaradi samodejnega dodajanja storitev v vsebnik DI je delo zelo prijetno. Nette v vsebnik samodejno doda predstavnike, vendar lahko enostavno dodate tudi katere koli druge razrede.
Samo določite, v katerih imenikih (in podimenikih) naj se razredi iščejo:
search:
- in: %appDir%/Forms
- in: %appDir%/Model
Običajno ne želimo dodati vseh razredov in vmesnikov, zato jih lahko filtriramo:
search:
- in: %appDir%/Forms
# filtriranje po imenu datoteke (niz|recept[])
files:
- *Factory.php
# filtriranje po imenu razreda (string|string[])
classes:
- *Factory
Lahko pa izberemo razrede, ki dedujejo ali implementirajo vsaj enega od naslednjih razredov:
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
Določite lahko tudi negativna pravila, tj. maske imen razredov ali prednikov, in če so v skladu z njimi, storitev ne bo dodana v vsebnik DI:
search:
- in: %appDir%
exclude:
datoteke: ...
classes: ...
extends: ...
implements: ...
Za dodane storitve lahko nastavite oznake:
search:
- in: %appDir%
tags: ...
Združevanje
Če se elementi z istimi ključi pojavijo v več konfiguracijskih datotekah, se prepišejo ali združijo v primeru polj. Kasneje vključena datoteka ima večjo prednost.
config1.neon | config2.neon | rezultat |
---|---|---|
|
|
|
Če želite preprečiti združevanje določenega polja, uporabite izklicnik takoj za imenom polja:
config1.neon. | config2.neon | rezultat |
---|---|---|
|
|
|