DI konténer konfigurálása
A Nette DI konténer konfigurációs lehetőségeinek áttekintése.
Konfigurációs fájl
A Nette DI konténer könnyen vezérelhető a konfigurációs fájlok segítségével. Ezeket általában NEON formátumban írják. A szerkesztéshez olyan szerkesztőket ajánlunk használni , amelyek támogatják ezt a formátumot.
decorator: Díszítő:
di: DI Container
extensions: További DI-bővítmények telepítése
includes: Beleértve a fájlokat
parameters: Paraméterek
search: Automatikus szolgáltatás regisztráció
services: Szolgáltatások
A %
, you must escape it by doubling it to %%
karaktert tartalmazó
karakterlánc írása.
Paraméterek
Meghatározhat olyan paramétereket, amelyeket aztán a szolgáltatásdefiníciók részeként használhat. Ez segíthet elkülöníteni azokat az értékeket, amelyeket rendszeresebben szeretne módosítani.
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
A foo
paraméterre a %foo%
címen keresztül bármely konfigurációs fájlban hivatkozhat.
Használhatók a stringeken belül is, mint például a '%wwwDir%/images'
.
A paramétereknek nem csak karakterláncoknak kell lenniük, lehetnek tömbértékek is:
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
Egyetlen kulcsra hivatkozhat a %mailer.user%
.
Ha a kódodban, például az osztályodban szükséged van bármely paraméter értékére, akkor add át azt ennek az osztálynak. Például a konstruktorban. Nincs olyan globális konfigurációs objektum, amelyet az osztályok lekérdezhetnének a paraméterértékekért. Ez ellenkezne a függőségi injektálás elvével.
Szolgáltatások
Lásd a külön fejezetet.
Díszítő
Hogyan lehet egy bizonyos típusú összes szolgáltatást tömegesen szerkeszteni? Meg kell hívni egy bizonyos metódust egy adott közös őstől öröklődő összes bemutatóhoz? Erre szolgál a dekorátor.
decorator:
# minden olyan szolgáltatáshoz, amely ennek az osztálynak vagy interfésznek a példánya.
App\UI\BasePresenter:
setup:
- # hívja meg ezt a metódust
- $absoluteUrls = true # és állítsuk be a változót
A dekorátor használható címkék beállítására vagy az injektálási mód bekapcsolására is.
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
A DI konténer technikai beállításai.
di:
# mutatja a DIC-et a Tracy Barban?
debugger: ... # (bool) alapértelmezés szerint true
# olyan paramétertípusok, amelyeket soha nem kapcsolsz be automatikusan
excluded: ... # (string[])
# az osztály, amelytől a DI konténer örököl.
parentClass: ... # (string) alapértelmezett értéke Nette\DI\Container
Metaadatok exportálása
A DI konténer osztály is sok metaadatot tartalmaz. Ezt csökkentheti a metaadatok exportjának csökkentésével.
di:
export:
# paraméterek exportálása?
parameters: false # (bool) alapértelmezett értéke true
# exportálni a címkéket és melyeket?
tags: # (string[]|bool) az alapértelmezett az all
- event.subscriber
# exportálja az autowiring adatait és melyiket?
types: # (string[]|bool) az alapértelmezett az all
- Nette\Database\Connection
- Symfony\Component\Console\Application
Ha nem használja a $container->getParameters()
tömböt, kikapcsolhatja a paraméterek exportálását.
Továbbá csak azokat a címkéket exportálhatja, amelyeken keresztül a $container->findByTag(...)
módszerrel
szolgáltatásokat kap. Ha egyáltalán nem hívja meg a módszert, akkor a false
segítségével teljesen
letilthatja a címkék exportálását.
Jelentősen csökkentheti az autowiring metaadatait, ha a $container->getByType()
metódus paramétereként megadja a használt osztályokat. És ismét, ha egyáltalán nem hívja meg a metódust (vagy csak az
application:bootstrap-ben a Nette\Application\Application
),
akkor a false
segítségével teljesen letilthatja az exportot.
Bővítések
Más DI-bővítmények regisztrálása. Így például a Dibi\Bridges\Nette\DibiExtension22
DI-bővítményt a
dibi
név alatt adjuk hozzá a név alatt:
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
Ezután konfiguráljuk a szintén dibi
nevű szekciójában:
dibi:
host: localhost
Hozzáadhatunk egy bővítmény osztályt is paraméterekkel:
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
Beleértve a fájlokat
További konfigurációs fájlokat lehet beilleszteni a includes
szakaszba:
includes:
- parameters.php
- services.neon
- presenters.neon
A parameters.php
név nem elírás, a konfiguráció egy PHP-fájlba is beírható, amely azt tömbként adja
vissza:
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
Ha a konfigurációs fájlokban azonos kulcsú elemek jelennek meg, akkor azok felülíródnak, vagy
tömbök esetén összevonásra kerülnek. A később bevont fájlnak magasabb prioritása van, mint
az előzőnek. Az a fájl, amelyben a includes
szakasz szerepel, magasabb prioritással rendelkezik, mint a benne
foglalt fájlok.
Keresés
A szolgáltatások automatikus hozzáadása a DI konténerhez rendkívül kellemes munkát tesz lehetővé. A Nette automatikusan hozzáadja az előadókat a konténerhez, de bármilyen más osztályokat is könnyen hozzáadhatunk.
Csak adjuk meg, hogy mely könyvtárakban (és alkönyvtárakban) kell keresni az osztályokat:
search:
- in: %appDir%/Forms
- in: %appDir%/Model
Általában azonban nem akarjuk az összes osztályt és interfészt felvenni, így szűrhetjük őket:
search:
- in: %appDir%/Forms
# szűrés fájlnév alapján (string|string[])
files:
- *Factory.php
# szűrés osztálynév alapján (string|string[])
classes:
- *Factory
Vagy kiválaszthatjuk azokat az osztályokat, amelyek a következő osztályok közül legalább egyet örökölnek vagy implementálnak:
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
Meghatározhatunk negatív szabályokat is, azaz osztálynév maszkokat vagy ősöket, és ha ezek megfelelnek, a szolgáltatás nem kerül hozzá a DI konténerhez:
search:
- in: %appDir%
exclude:
fájlok: ...
classes: ...
extends: ...
implements: ...
A hozzáadott szolgáltatásokhoz címkéket lehet beállítani:
search:
- in: %appDir%
tags: ...
Összevonás
Ha azonos kulcsú elemek több konfigurációs fájlban is megjelennek, akkor azok felülíródnak, vagy tömbök esetén egyesülnek. A később felvett fájlnak nagyobb prioritása van.
config1.neon | config2.neon | result |
---|---|---|
|
|
|
Egy adott tömb összevonásának megakadályozásához használjon felkiáltójelet a tömb neve után:
neon | config2.neon | eredmény |
---|---|---|
|
|
|