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.

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
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

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
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
verzió: 3.x