Nette Documentation Preview

syntax
Configurarea containerului DI
*****************************

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


Fișier de configurare .[#toc-configuration-file]
================================================

Containerul Nette DI este ușor de controlat cu ajutorul fișierelor de configurare. Acestea sunt de obicei scrise în [format NEON |neon:format]. Pentru editare, vă recomandăm să folosiți [editoare cu suport |best-practices:editors-and-tools#ide-editor] pentru acest format.

<pre>
"decorator .[prism-token prism-atrule]":[#Decorator]: 	"Decorator .[prism-token prism-comment]"<br>
"di .[prism-token prism-atrule]":[#DI]: 			"DI Container .[prism-token prism-comment]"<br>
"extensions .[prism-token prism-atrule]":[#Extensions]: 	"Instalați extensii DI suplimentare .[prism-token prism-comment]"<br>
"includes .[prism-token prism-atrule]":[#Including files]: 	"Fișiere de includere .[prism-token prism-comment]"<br>
"parameters .[prism-token prism-atrule]":[#Parameters]: 	"Parametrii .[prism-token prism-comment]"<br>
"search .[prism-token prism-atrule]":[#Search]: 		"Înregistrare automată a serviciilor .[prism-token prism-comment]"<br>
"services .[prism-token prism-atrule]":[services]: 		"Servicii .[prism-token prism-comment]"
</pre>

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


Parametrii .[#toc-parameters]
=============================

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.

```neon
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:

```neon
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 .[#toc-services]
=========================

A se vedea [capitolul separat |services].


Decorator .[#toc-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.

```neon
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 |services#Tags] sau pentru a activa [modul de injectare |services#Inject Mode].

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


DI
===

Setări tehnice ale containerului DI.

```neon
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 .[#toc-metadata-export]
--------------------------------------------

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

```neon
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->parameters`, 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 |autowiring] 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 [application:bootstrap] pentru a obține `Nette\Application\Application`), puteți dezactiva complet exportul cu `false`.


Extensii .[#toc-extensions]
===========================

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

```neon
extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22
```

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

```neon
dibi:
	host: localhost
```

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

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


Includerea fișierelor .[#toc-including-files]
=============================================

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

```neon
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
<?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 |#Merging] î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.


Căutare .[#toc-search]
======================

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:

```neon
search:
	# alegeți singuri denumirile secțiunilor
	myForms:
		in: %appDir%/Forms

	model:
		in: %appDir%/Model
```

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

```neon
search:
	myForms:
		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:


```neon
search:
	myForms:
		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:

```neon
search:
	myForms:
		exclude:
			classes: ...
			extends: ...
			implements: ...
```

Se pot stabili etichete pentru serviciile adăugate:

```neon
search:
	myForms:
		tags: ...
```


Fuziune .[#toc-merging]
=======================

Î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.

<table class=table>
<tr>
	<th width=33%>config1.neon</th>
	<th width=33%>config2.neon</th>
	<th>rezultat</th>
</tr>
<tr>
	<td>
```neon
items:
	- 1
	- 2
```
	</td>
	<td>
```neon
items:
	- 3
```
	</td>
	<td>
```neon
items:
	- 1
	- 2
	- 3
```
	</td>
</tr>
</table>

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

<table class=table>
<tr>
	<th width=33%>config1.neon</th>
	<th width=33%>config2.neon</th>
	<th>rezultat</th>
</tr>
<tr>
	<td>
```neon
items:
	- 1
	- 2
```
	</td>
	<td>
```neon
items!:
	- 3
```
	</td>
	<td>
```neon
items:
	- 3
```
	</td>
</tr>
</table>


{{maintitle: Configurație de injecție a dependenței}}

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->parameters, 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:
	# alegeți singuri denumirile secțiunilor
	myForms:
		in: %appDir%/Forms

	model:
		in: %appDir%/Model

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

search:
	myForms:
		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:
	myForms:
		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:
	myForms:
		exclude:
			classes: ...
			extends: ...
			implements: ...

Se pot stabili etichete pentru serviciile adăugate:

search:
	myForms:
		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