DI: Konfigurace

Přehled konfiguračních voleb pro Nette DI kontejner.

Nette DI kontejner se snadno ovládá pomocí konfiguračních souborů. Ty se obvykle zapisují ve formátu NEON. K editaci doporučujeme editory s podporou tohoto formátu.

 decorator: 	Dekorátor
di: DI kontejner
extensions: Instalace dalších DI rozšíření
includes: Vkládání souborů
parameters: Parametry
services: Služby

Chcete-li zapsat řetězec začínající znakem @ nebo obsahující %, musíte znak escapovat zdvojením na @@ nebo %%.

Parametry

V konfiguraci můžete definovat parametry, které lze pak použít jako součást definic služeb. Čímž můžete zpřehlednit konfiguraci nebo sjednotit a vyčlenit hodnoty, které se budou měnit.

parameters:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: secret

Na parametr dsn se odkážeme kdekoliv v konfiguraci zápisem %dsn%. Parametry lze používat i uvnitř řetězců jako '%wwwDir%/images'.

Parametry nemusí být jen řetězce nebo čísla, mohou také obsahovat pole:

parameters:
	mailer:
		host: smtp.example.com
		secure: ssl
		user: franta@gmail.com
	languages: [cs, en, de]

Na konkrétní klíč se odkážeme jako %mailer.user%.

Pokud potřebujete ve vašem kódu, například třídě, zjistit hodnotu jakékoliv parametru, tak jej do této třídy předejte. Například v konstruktoru. Neexistuje žádný globální objekt představující konfiguraci, kterého by se třídy dotazovaly na hodnoty parametrů. To by bylo porušením principu dependency injection.

Služby

Viz samostatná kapitola.

Decorator

Jak upravit hromadně všechny služby určitého typu? Třeba zavolat určitou metodu u všech presenterů, které dědí od konkrétního společného předka? Od toho je tu decorator.

decorator:
	# u všech služeb, co jsou instancí této třídy nebo rozhraní
	App\Presenters\BasePresenter:
		setup:
			- setProjectId(10)       # zavolej tuto metodu
			- $absoluteUrls = true   # a nastav proměnnou

Decorator se dá používat také pro nastavení tagů nebo zapnutí režimu inject.

decorator:
	InjectableInterface:
		tags: [mytag: 1]
		inject: true

DI

Technické nastavení DI kontejneru.

di:
	# zobrazit DIC v Tracy Bar?
	debugger: ...        # (bool) výchozí je true

	# typy parametrů, které nikdy neautowirovat
	excluded: ...        # (string[])

	# třída, od které dědí DI kontejner
	parentClass: ...     # (string) výchozí je Nette\DI\Container

Rozšíření

Registrace dalších DI rozšíření. Tímto způsobem přidáme např. DI rozšíření Dibi\Bridges\Nette\DibiExtension22 pod názvem dibi

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Následně ho tedy konfigurujeme v sekci dibi:

dibi:
	host: localhost

Jako rozšíření lze přidat i třídu, která má parametry:

extensions:
	application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)

Vkládání souborů

Další konfigurační soubory můžeme vložit v sekci includes:

includes:
	- parameters.php
	- services.neon
	- presenters.neon

Název parameters.php není překlep, konfigurace může být zapsaná také v PHP souboru, který ji vrátí jako pole:

<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];

Pokud se v konfiguračních souborech objeví prvky se stejnými klíči, budou přepsány, nebo v případě polí sloučeny. Později vkládaný soubor má vyšší prioritu než předchozí. Soubor, ve kterém je sekce includes uvedena, má vyšší prioritu než v něm vkládané soubory.

Slučování

Pokud se ve více konfiguračních souborech objeví prvky se stejnými klíči, budou přepsány, nebo v případě polí sloučeny. Později vkládaný soubor má vyšší prioritu než předchozí.

config1.neon config2.neon výsledek
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

U polí lze zabránit slučování uvedením vykřičníku za názvem klíče:

config1.neon config2.neon výsledek
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3