Nette Documentation Preview

syntax
Container Nette DI
******************

.[perex]
Nette DI este una dintre cele mai interesante biblioteci Nette. Aceasta poate genera și actualiza automat containere DI compilate care sunt extrem de rapide și uimitor de ușor de configurat.

Serviciile care urmează să fie create de un container DI sunt de obicei definite cu ajutorul fișierelor de configurare în [format NEON |neon:format]. Containerul pe care l-am creat manual în [secțiunea anterioară |container] ar fi scris după cum urmează:

```neon
parameters:
	db:
		dsn: 'mysql:'
		user: root
		password: '***'

services:
	- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
	- ArticleFactory
	- UserController
```

Notația este foarte scurtă.

Toate dependențele declarate în constructorii claselor `ArticleFactory` și `UserController` sunt găsite și trecute de Nette DI însuși datorită așa-numitei [autowiring], astfel încât nu este nevoie să se specifice nimic în fișierul de configurare.
Astfel, chiar dacă parametrii se schimbă, nu trebuie să modificați nimic în configurație. Nette va regenera automat containerul. Vă puteți concentra acolo pur și simplu pe dezvoltarea aplicației.

Dacă doriți să treceți dependențele folosind setteri, utilizați secțiunea de [configurare |services#setup] pentru a face acest lucru.

Nette DI va genera direct codul PHP pentru container. Rezultatul este astfel un fișier `.php` pe care îl puteți deschide și studia. Acest lucru vă permite să vedeți exact cum funcționează containerul. De asemenea, îl puteți depana în IDE și îl puteți parcurge. Și cel mai important: PHP-ul generat este extrem de rapid.

Nette DI poate genera, de asemenea, cod de [fabrică |factory] pe baza interfeței furnizate. Prin urmare, în loc de clasa `ArticleFactory`, trebuie doar să creăm o interfață în aplicație:

```php
interface ArticleFactory
{
	function create(): Article;
}
```

Puteți găsi exemplul complet [pe GitHub |https://github.com/nette-examples/di-example-doc].


Utilizare autonomă .[#toc-standalone-use]
-----------------------------------------

Utilizarea bibliotecii Nette DI într-o aplicație este foarte simplă. Mai întâi o instalăm cu Composer (pentru că descărcarea fișierelor zip este atât de depășită):

```shell
composer require nette/di
```

Următorul cod creează o instanță a containerului DI în conformitate cu configurația stocată în fișierul `config.neon`:

```php
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
	$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;
```

Containerul este generat o singură dată, codul său este scris în memoria cache (directorul `__DIR__ . '/temp'` ), iar la solicitările ulterioare este citit doar de acolo.

Metodele `getService()` sau `getByType()` sunt utilizate pentru a crea și a prelua servicii. Acesta este modul în care creăm obiectul `UserController`:

```php
$database = $container->getByType(UserController::class);
$database->query('...');
```

În timpul dezvoltării, este util să se activeze modul de reîmprospătare automată, în care containerul este regenerat automat dacă se modifică orice clasă sau fișier de configurare. Trebuie doar să furnizați `true` ca al doilea argument în constructorul `ContainerLoader`.

```php
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
```


Utilizarea cu Nette Framework .[#toc-using-it-with-the-nette-framework]
-----------------------------------------------------------------------

După cum am arătat, utilizarea Nette DI nu este limitată la aplicațiile scrise în Nette Framework, ci o puteți implementa oriunde cu doar 3 linii de cod.
Cu toate acestea, dacă dezvoltați aplicații în Nette Framework, configurarea și crearea containerului este gestionată de [Bootstrap |application:bootstrap#toc-di-container-configuration].

Container Nette DI

Nette DI este una dintre cele mai interesante biblioteci Nette. Aceasta poate genera și actualiza automat containere DI compilate care sunt extrem de rapide și uimitor de ușor de configurat.

Serviciile care urmează să fie create de un container DI sunt de obicei definite cu ajutorul fișierelor de configurare în format NEON. Containerul pe care l-am creat manual în secțiunea anterioară ar fi scris după cum urmează:

parameters:
	db:
		dsn: 'mysql:'
		user: root
		password: '***'

services:
	- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
	- ArticleFactory
	- UserController

Notația este foarte scurtă.

Toate dependențele declarate în constructorii claselor ArticleFactory și UserController sunt găsite și trecute de Nette DI însuși datorită așa-numitei autowiring, astfel încât nu este nevoie să se specifice nimic în fișierul de configurare. Astfel, chiar dacă parametrii se schimbă, nu trebuie să modificați nimic în configurație. Nette va regenera automat containerul. Vă puteți concentra acolo pur și simplu pe dezvoltarea aplicației.

Dacă doriți să treceți dependențele folosind setteri, utilizați secțiunea de configurare pentru a face acest lucru.

Nette DI va genera direct codul PHP pentru container. Rezultatul este astfel un fișier .php pe care îl puteți deschide și studia. Acest lucru vă permite să vedeți exact cum funcționează containerul. De asemenea, îl puteți depana în IDE și îl puteți parcurge. Și cel mai important: PHP-ul generat este extrem de rapid.

Nette DI poate genera, de asemenea, cod de fabrică pe baza interfeței furnizate. Prin urmare, în loc de clasa ArticleFactory, trebuie doar să creăm o interfață în aplicație:

interface ArticleFactory
{
	function create(): Article;
}

Puteți găsi exemplul complet pe GitHub.

Utilizare autonomă

Utilizarea bibliotecii Nette DI într-o aplicație este foarte simplă. Mai întâi o instalăm cu Composer (pentru că descărcarea fișierelor zip este atât de depășită):

composer require nette/di

Următorul cod creează o instanță a containerului DI în conformitate cu configurația stocată în fișierul config.neon:

$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
	$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;

Containerul este generat o singură dată, codul său este scris în memoria cache (directorul __DIR__ . '/temp' ), iar la solicitările ulterioare este citit doar de acolo.

Metodele getService() sau getByType() sunt utilizate pentru a crea și a prelua servicii. Acesta este modul în care creăm obiectul UserController:

$database = $container->getByType(UserController::class);
$database->query('...');

În timpul dezvoltării, este util să se activeze modul de reîmprospătare automată, în care containerul este regenerat automat dacă se modifică orice clasă sau fișier de configurare. Trebuie doar să furnizați true ca al doilea argument în constructorul ContainerLoader.

$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);

Utilizarea cu Nette Framework

După cum am arătat, utilizarea Nette DI nu este limitată la aplicațiile scrise în Nette Framework, ci o puteți implementa oriunde cu doar 3 linii de cod. Cu toate acestea, dacă dezvoltați aplicații în Nette Framework, configurarea și crearea containerului este gestionată de Bootstrap.