Configurarea containerului DI

Prezentare generală a opțiunilor de configurare pentru containerul Nette DI.

Fișier de configurare

Containerul Nette DI este ușor de controlat cu ajutorul fișierelor de configurare. Acestea sunt de obicei scrise în format NEON. Pentru editare, vă recomandăm să folosiți editoare cu suport pentru acest format.

 decorator: 	Decorator
di: DI Container
extensions: Instalați extensii DI suplimentare
includes: Fișiere de includere
parameters: Parametrii
search: Înregistrare automată a serviciilor
services: Servicii

Pentru a scrie un șir care conține caracterul %, you must escape it by doubling it to %%.

Parametrii

Puteți defini parametrii care pot fi apoi utilizați ca parte a definițiilor serviciilor. Acest lucru poate ajuta la separarea valorilor pe care veți dori să le modificați mai regulat.

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

Puteți face referire la parametrul foo prin intermediul %foo% în altă parte în orice fișier de configurare. De asemenea, pot fi utilizați în interiorul unor șiruri de caractere precum '%wwwDir%/images'.

Parametrii nu trebuie să fie doar șiruri de caractere, ci și valori de tip array:

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

Vă puteți referi la o singură cheie ca %mailer.user%.

Dacă aveți nevoie să obțineți valoarea unui parametru în codul dumneavoastră, de exemplu în clasa dumneavoastră, atunci treceți-l în această clasă. De exemplu, în constructor. Nu există un obiect de configurare globală care să poată fi interogat de clase pentru valorile parametrilor. Acest lucru ar fi contrar principiului de injectare a dependențelor.

Servicii

A se vedea capitolul separat.

Decorator

Cum se pot edita în bloc toate serviciile de un anumit tip? Aveți nevoie să apelați o anumită metodă pentru toți prezentatorii care moștenesc de la un anumit strămoș comun? De aici vine decoratorul.

decorator:
	# pentru toate serviciile care sunt instanțe ale acestei clase sau interfețe
	App\Presenters\BasePresenter:
		setup:
			- setProjectId(10)       # apelează această metodă
			- $absoluteUrls = true   # și setează variabila

Decoratorul poate fi utilizat și pentru a seta etichete sau pentru a activa modul de injectare.

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

DI

Setări tehnice ale containerului DI.

di:
	# arată DIC în Tracy Bar?
	debugger: ...        # (bool) valoarea implicită este true

	# tipuri de parametri pe care nu îi conectați niciodată automat
	excluded: ...        # (string[])

	# clasa din care moștenește containerul DI
	parentClass: ...     # (string) valoarea implicită este Nette\DI\Container

Exportul de metadate

Clasa container DI conține, de asemenea, o mulțime de metadate. Puteți să le reduceți prin reducerea exportului de metadate.

di:
	export:
		# pentru a exporta parametrii?
		parameters: false   # (bool) valoarea implicită este true

		# să exporte etichete și care dintre ele?
		tags:               # (string[]|bool) implicit toate
			- event.subscriber

		# exportă date pentru autocablare și care?
		types:              # (string[]|bool) implicit toate
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Dacă nu utilizați matricea $container->getParameters(), puteți dezactiva exportul de parametri. În plus, puteți exporta numai acele etichete prin care obțineți servicii utilizând metoda $container->findByTag(...). Dacă nu apelați deloc metoda, puteți dezactiva complet exportul de etichete cu false.

Puteți reduce în mod semnificativ metadatele pentru cablarea automată prin specificarea claselor pe care le utilizați ca parametru pentru metoda $container->getByType(). Și, din nou, dacă nu apelați deloc metoda (sau doar în bootstrap pentru a obține Nette\Application\Application), puteți dezactiva complet exportul cu false.

Extensii

Înregistrarea altor extensii DI. În acest fel, adăugăm, de exemplu, extensia DI Dibi\Bridges\Nette\DibiExtension22 sub numele dibi:

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Apoi o configurăm în secțiunea sa numită tot dibi:

dibi:
	host: localhost

De asemenea, puteți adăuga o clasă de extensie cu parametri:

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

Includerea fișierelor

Fișiere de configurare suplimentare pot fi inserate în secțiunea includes:

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

Numele parameters.php nu este o greșeală de tipar, configurația poate fi scrisă și într-un fișier PHP, care o returnează sub formă de matrice:

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

În cazul în care în fișierele de configurare apar elemente cu aceleași chei, acestea vor fi suprascrise sau fuzionate în cazul array-urilor. Ultimul fișier inclus are o prioritate mai mare decât cel anterior. Fișierul în care este listată secțiunea includes are o prioritate mai mare decât fișierele incluse în el.

Adăugarea automată a serviciilor în containerul DI face munca extrem de plăcută. Nette adaugă automat prezentatorii la container, dar puteți adăuga cu ușurință orice alte clase.

Trebuie doar să specificați în ce directoare (și subdirectoare) trebuie căutate clasele:

search:
	-	in: %appDir%/Forms
	-	in: %appDir%/Model

De obicei, însă, nu dorim să adăugăm toate clasele și interfețele, așa că le putem filtra:

search:
	-	in: %appDir%/Forms

		# filtrarea după numele fișierului (string|string[])
		files:
			- *Factory.php

		# filtrarea după numele clasei (string|string[])
		classes:
			- *Factory

Sau putem selecta clasele care moștenesc sau implementează cel puțin una dintre următoarele clase:

search:
	-	in: %appDir%
		extends:
			- App\*Form
		implements:
			- App\*FormInterface

De asemenea, se pot defini reguli negative, adică măști de nume de clasă sau strămoși, iar dacă acestea sunt conforme, serviciul nu va fi adăugat la containerul DI:

search:
	-	in: %appDir%
		exclude:
fișiere: ...
			classes: ...
			extends: ...
			implements: ...

Se pot stabili etichete pentru serviciile adăugate:

search:
	-	in: %appDir%
		tags: ...

Fuziune

În cazul în care elemente cu aceleași chei apar în mai multe fișiere de configurare, acestea vor fi suprascrise sau fuzionate, în cazul tablourilor. Ultimul fișier inclus are o prioritate mai mare.

config1.neon config2.neon rezultat
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

Pentru a împiedica fuzionarea unei anumite matrice, utilizați semnul exclamării imediat după numele matricei:

config1.neon config2.neon rezultat
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
versiune: 3.x