Konfiguracija DI vsebnika
Pregled konfiguracijskih možnosti za Nette DI vsebnik.
Konfiguracijska datoteka
Nette DI vsebnik se enostavno upravlja s konfiguracijskimi datotekami. Te se običajno zapisujejo v formatu NEON. Za urejanje priporočamo urejevalnike s podporo za ta format.
decorator: Dekorator
di: DI vsebnik
extensions: Namestitev dodatnih DI razširitev
includes: Vključevanje datotek
parameters: Parametri
search: Samodejna registracija storitev
services: Storitve
Če želite zapisati niz, ki vsebuje znak %
, ga morate ubežati z podvojitvijo na
%%
.
Parametri
V konfiguraciji lahko definirate parametre, ki jih lahko nato uporabite kot del definicij storitev. S tem lahko naredite konfiguracijo preglednejšo ali združite in izločite vrednosti, ki se bodo spreminjale.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
Na parameter dsn
se sklicujemo kjerkoli v konfiguraciji z zapisom %dsn%
. Parametre lahko
uporabljamo tudi znotraj nizov kot '%wwwDir%/images'
.
Parametri niso nujno samo nizi ali števila, lahko vsebujejo tudi polja:
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
Na določen ključ se sklicujemo kot %mailer.user%
.
Če potrebujete v vaši kodi, na primer v razredu, ugotoviti vrednost katerega koli parametra, ga posredujte v ta razred. Na primer v konstruktorju. Ne obstaja noben globalni objekt, ki bi predstavljal konfiguracijo, katerega bi razredi spraševali za vrednosti parametrov. To bi bilo kršenje načela dependency injection.
Storitve
Glej samostojno poglavje.
Decorator
Kako množično urediti vse storitve določenega tipa? Na primer poklicati določeno metodo pri vseh presenterjih, ki dedujejo od določenega skupnega prednika? Za to je tu decorator.
decorator:
# pri vseh storitvah, ki so instanca tega razreda ali vmesnika
App\Presentation\BasePresenter:
setup:
- setProjectId(10) # pokliči to metodo
- $absoluteUrls = true # in nastavi spremenljivko
Decorator se lahko uporablja tudi za nastavitev oznak ali vklop načina inject.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
Tehnične nastavitve DI vsebnika.
di:
# prikazati DIC v Tracy Bar?
debugger: ... # (bool) privzeto je true
# tipi parametrov, ki jih nikoli ne avtomatsko povezovati
excluded: ... # (string[])
# dovoliti leno ustvarjanje storitev?
lazy: ... # (bool) privzeto je false
# razred, od katerega deduje DI vsebnik
parentClass: ... # (string) privzeto je Nette\DI\Container
Lene storitve
Nastavitev lazy: true
aktivira leno (odloženo) ustvarjanje storitev. To pomeni, da storitve niso dejansko
ustvarjene v trenutku, ko jih zahtevamo iz DI vsebnika, ampak šele v trenutku njihove prve uporabe. To lahko pospeši zagon
aplikacije in zmanjša pomnilniške zahteve, saj se ustvarijo samo tiste storitve, ki so v danem zahtevku dejansko potrebne.
Pri določeni storitvi lahko leno ustvarjanje spremenimo.
Lene objekte je mogoče uporabiti samo za uporabniške razrede, ne pa za interne PHP razrede. Zahteva PHP 8.4 ali novejšo različico.
Izvoz metapodatkov
Razred DI vsebnika vsebuje tudi veliko metapodatkov. Lahko ga zmanjšate tako, da zmanjšate izvoz metapodatkov.
di:
export:
# izvoziti parametre?
parameters: false # (bool) privzeto je true
# izvoziti oznake in katere?
tags: # (string[]|bool) privzeto so vse
- event.subscriber
# izvoziti podatke za autowiring in katere?
types: # (string[]|bool) privzeto so vsi
- Nette\Database\Connection
- Symfony\Component\Console\Application
Če ne uporabljate polja $container->getParameters()
, lahko izklopite izvoz parametrov. Nadalje lahko izvozite
samo tiste oznake, prek katerih pridobivate storitve z metodo $container->findByTag(...)
. Če metode sploh ne
kličete, lahko popolnoma izklopite izvoz oznak z false
.
Znatno lahko zmanjšate metapodatke za samodejnim
povezovanjem tako, da navedete razrede, ki jih uporabljate kot parameter metode $container->getByType()
. In
spet, če metode sploh ne kličete (oz. samo v bootstrapu za
pridobitev Nette\Application\Application
), lahko izvoz popolnoma izklopite z false
.
Razširitve
Registracija dodatnih DI razširitev. Na ta način dodamo npr. DI razširitev Dibi\Bridges\Nette\DibiExtension22
pod imenom dibi
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
Nato jo torej konfiguriramo v sekciji dibi
:
dibi:
host: localhost
Kot razširitev lahko dodamo tudi razred, ki ima parametre:
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
Vključevanje datotek
Druge konfiguracijske datoteke lahko vključimo v sekciji includes
:
includes:
- parameters.php
- services.neon
- presenters.neon
Ime parameters.php
ni napaka, konfiguracija je lahko zapisana tudi v PHP datoteki, ki jo vrne kot polje:
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
Če se v konfiguracijskih datotekah pojavijo elementi z enakimi ključi, bodo prepisani ali v primeru polj združeni. Kasneje vključena datoteka ima višjo prioriteto kot prejšnja. Datoteka, v kateri je
navedena sekcija includes
, ima višjo prioriteto kot v njej vključene datoteke.
Iskanje
Samodejno dodajanje storitev v DI vsebnik izjemno olajša delo. Nette samodejno dodaja v vsebnik presenterje, vendar je mogoče enostavno dodajati tudi katere koli druge razrede.
Zadostuje navesti, v katerih mapah (in podmapah) naj išče razrede:
search:
- in: %appDir%/Forms
- in: %appDir%/Model
Običajno pa ne želimo dodati popolnoma vseh razredov in vmesnikov, zato jih lahko filtriramo:
search:
- in: %appDir%/Forms
# filtriranje po imenu datoteke (string|string[])
files:
- *Factory.php
# filtriranje po imenu razreda (string|string[])
classes:
- *Factory
Ali pa lahko izberemo razrede, ki dedujejo ali implementirajo vsaj enega od navedenih razredov:
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
Lahko definiramo tudi izključujoča pravila, tj. maske imena razreda ali dedne prednike, ki če ustrezajo, se storitev v DI vsebnik ne doda:
search:
- in: %appDir%
exclude:
files: ...
classes: ...
extends: ...
implements: ...
Vsem storitvam lahko nastavimo oznake:
search:
- in: %appDir%
tags: ...
Združevanje
Če se v več konfiguracijskih datotekah pojavijo elementi z enakimi ključi, bodo prepisani ali v primeru polj združeni. Kasneje vključena datoteka ima višjo prioriteto kot prejšnja.
config1.neon | config2.neon | rezultat |
---|---|---|
|
|
|
Pri poljih lahko preprečimo združevanje z navedbo klicaja za imenom ključa:
config1.neon | config2.neon | rezultat |
---|---|---|
|
|
|