You are browsing the unmaintained documentation for old Nette 2.3. See documentation for current Nette.

DI: konfigurace služeb

Samotná konfigurace se obykle zapisuje v NEON souboru. Se syntaxí se můžete seznámit na stránce https://ne-on.org. V souboru můžeme nastavit

Konfigurační soubor je místem, kam umísťujeme definice vlastních služeb. Slouží k tomu sekce services. Například tato definice služby:

services:
	database: Nette\Database\Connection(%dsn%, %user%, %password%)

# nebo ve dvou řádcích:
	database:
		factory: Nette\Database\Connection(%dsn%, %user%, %password%)

# nebo ve třech řádcích :-)
	database:
		class: Nette\Database\Connection
		arguments: [%dsn%, %user%, %password%]

Setup

services:
	database:
		factory: Nette\Database\Connection(%dsn%, %user%, %password%)
		setup:
			- setCacheStorage(@cacheStorage)

Autowiring umí odkazy na jiné služby doplnit automaticky, takže lze parametry úplně vynechat:

setup:
	- setCacheStorage

Pokud služba cacheStorage neexistuje, můžeme jako parametr uvést výsledek volání funkce:

setup:
	- setCacheStorage( Factory::createStorage() )

# nebo metody jiné služby:
	- setCacheStorage( @factory::createStorage() )

Případně nově vytvořenou třídu:

setup:
	- setCacheStorage( Nette\Caching\Storages\FileStorage(%tempDir%) )

Lze nastavovat i hodnoty proměnných:

substitutions

setup:
	- $substitutions( [db: test] )

Kompletní příklad:

parameters:
	database:
		driver: mysql
		host: localhost
		dbname: test
		user: jim
		password: beam
		substitutions:
			db: test

services:
	database:
		factory: Nette\Database\Connection(
			'%database.driver%:host=%database.host%;dbname=%database.dbname%',
			%database.user%, %database.password%, null,
			Nette\Database\Reflection\DiscoveredReflection()
		)
		setup:
			- setCacheStorage
			- $substitutions( %database.substitutions% )

Anonymní služby

Pojmenování služeb je vhodné hlavně ve chvíli, kdy na ně chceme odkazovat z jiných částí konfiguračního souboru. Pokud na službu již není odkazováno, není ji potřeba pojmenovávat. Pro anonymní služby použijte následující syntax:

services:
	- Simple\Service

	-
		factory: Complex\Service
		setup:
			- setLang(%lang%)

Pokud však budete chtít později odkázat na anonymní službu, budete muset uvést úplný název třídy (rozhraní).

services:
	router: @App\RouterFactory::createRouter

Také je potřeba mít na paměti, že z povahy anonymních služeb nelze mít registrovaných více instancí stejného typu, protože by nebylo možné je rozlišit.

Dědičnost služeb

services:
	dev_database < database
		setup:
			- Diagnostics\ConnectionPanel::initialize

Auto-wiring

Auto-wiring umí automaticky předávat do konstruktoru a dalších metod požadované služby. Řídí se podle type hintů a anotací @return. Služba odpovídající hledané třídě musí být v kontejneru právě jedna, jinak se vyhodí výjimka.

Pokud potřebujeme definovat více služeb stejného typu, můžeme je z auto-wiringu vyřadit:

services:
	cacheStorage:
		factory: Nette\Caching\Storages\FileStorage(%tempDir%)

	tempCacheStorage:
		factory: Nette\Caching\Storages\DevNullStorage
		autowired: no

Pokud upravujeme základní služby Nette Frameworku, nesmíme se zapomenout ujistit, že kontejner zná třídy naší implementace. Pokud tedy nastavujeme vlastní factory pro službu, tak to znamená mít správně absolutní název třídy v annotaci @return, nebo nastavovat vždy i třídu do class.

Více konfiguračních souborů

V případě, že chceme pro nastavení používat více propojených konfiguračních souborů, můžeme je uvést v sekci includes.

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

Konfigurace se slučují tak, že nejvyšší prioritu má soubor obsahující sekci includes a nejnižší první vkládaný soubor. Slučování polí lze zabránit uvedením vykřičníku za název pole:

argument!: [1, 2, 3]
Vylepšit tuto stránku