Nette Documentation Preview

syntax
Zabojnik Nette DI
*****************

.[perex]
Nette DI je ena izmed najbolj zanimivih knjižnic Nette. Ustvari in samodejno posodablja sestavljene vsebnike DI, ki so izjemno hitri in jih je neverjetno enostavno konfigurirati.

Storitve, ki jih ustvarja vsebnik DI, so običajno opredeljene s konfiguracijskimi datotekami v [formatu NEON |neon:format]. Zabojnik, ki smo ga ročno ustvarili v [prejšnjem razdelku |container], bi bil zapisan na naslednji način:

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

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

Zapis je zelo kratek.

Vse odvisnosti, deklarirane v konstruktorjih razredov `ArticleFactory` in `UserController`, poišče in posreduje Nette DI sam zaradi tako imenovanega [samodejnega povezovanja |autowiring], zato v konfiguracijski datoteki ni treba ničesar navajati.
Torej tudi če se parametri spremenijo, vam v konfiguraciji ni treba ničesar spreminjati. Nette bo samodejno regeneriral vsebnik. V njem se lahko osredotočite izključno na razvoj aplikacije.

Če želite odvisnosti posredovati z uporabo nastavljalcev, za to uporabite [nastavitveni |services#setup] razdelek.

Nette DI bo neposredno ustvaril kodo PHP za vsebnik. Rezultat je torej datoteka `.php`, ki jo lahko odprete in preučite. Tako si lahko natančno ogledate, kako deluje vsebnik. Prav tako ga lahko razhroščate v okolju IDE in ga postopoma pregledujete. In kar je najpomembneje: generirana koda PHP je izjemno hitra.

Nette DI lahko na podlagi priloženega vmesnika ustvari tudi [tovarniško |factory] kodo. Zato moramo namesto razreda `ArticleFactory` v aplikaciji ustvariti le vmesnik:

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

Celoten primer najdete [na GitHubu |https://github.com/nette-examples/di-example-doc].


Samostojna uporaba .[#toc-standalone-use]
-----------------------------------------

Uporaba knjižnice Nette DI v aplikaciji je zelo preprosta. Najprej jo namestimo s programom Composer (ker je prenašanje datotek zip zelo zastarelo):

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

Naslednja koda ustvari primerek vsebnika DI v skladu s konfiguracijo, shranjeno v datoteki `config.neon`:

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

Zabojnik se ustvari samo enkrat, njegova koda se zapiše v predpomnilnik (imenik `__DIR__ . '/temp'` ) in se pri naslednjih zahtevah bere samo od tam.

Za ustvarjanje in pridobivanje storitev se uporabljata metodi `getService()` ali `getByType()`. Tako ustvarimo objekt `UserController`:

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

Med razvojem je koristno vklopiti način samodejnega osveževanja, pri katerem se vsebnik samodejno obnovi, če se spremeni kateri koli razred ali konfiguracijska datoteka. Samo navedite `true` kot drugi argument v konstruktorju `ContainerLoader`.

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


Uporaba z ogrodjem Nette .[#toc-using-it-with-the-nette-framework]
------------------------------------------------------------------

Kot smo pokazali, uporaba Nette DI ni omejena na aplikacije, napisane v ogrodju Nette, temveč jo lahko namestite kjer koli s samo tremi vrsticami kode.
Če pa razvijate aplikacije v okolju Nette Framework, za konfiguracijo in ustvarjanje vsebnika poskrbi [Bootstrap |application:bootstrap#toc-di-container-configuration].

Zabojnik Nette DI

Nette DI je ena izmed najbolj zanimivih knjižnic Nette. Ustvari in samodejno posodablja sestavljene vsebnike DI, ki so izjemno hitri in jih je neverjetno enostavno konfigurirati.

Storitve, ki jih ustvarja vsebnik DI, so običajno opredeljene s konfiguracijskimi datotekami v formatu NEON. Zabojnik, ki smo ga ročno ustvarili v prejšnjem razdelku, bi bil zapisan na naslednji način:

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

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

Zapis je zelo kratek.

Vse odvisnosti, deklarirane v konstruktorjih razredov ArticleFactory in UserController, poišče in posreduje Nette DI sam zaradi tako imenovanega samodejnega povezovanja, zato v konfiguracijski datoteki ni treba ničesar navajati. Torej tudi če se parametri spremenijo, vam v konfiguraciji ni treba ničesar spreminjati. Nette bo samodejno regeneriral vsebnik. V njem se lahko osredotočite izključno na razvoj aplikacije.

Če želite odvisnosti posredovati z uporabo nastavljalcev, za to uporabite nastavitveni razdelek.

Nette DI bo neposredno ustvaril kodo PHP za vsebnik. Rezultat je torej datoteka .php, ki jo lahko odprete in preučite. Tako si lahko natančno ogledate, kako deluje vsebnik. Prav tako ga lahko razhroščate v okolju IDE in ga postopoma pregledujete. In kar je najpomembneje: generirana koda PHP je izjemno hitra.

Nette DI lahko na podlagi priloženega vmesnika ustvari tudi tovarniško kodo. Zato moramo namesto razreda ArticleFactory v aplikaciji ustvariti le vmesnik:

interface ArticleFactory
{
	function create(): Article;
}

Celoten primer najdete na GitHubu.

Samostojna uporaba

Uporaba knjižnice Nette DI v aplikaciji je zelo preprosta. Najprej jo namestimo s programom Composer (ker je prenašanje datotek zip zelo zastarelo):

composer require nette/di

Naslednja koda ustvari primerek vsebnika DI v skladu s konfiguracijo, shranjeno v datoteki config.neon:

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

Zabojnik se ustvari samo enkrat, njegova koda se zapiše v predpomnilnik (imenik __DIR__ . '/temp' ) in se pri naslednjih zahtevah bere samo od tam.

Za ustvarjanje in pridobivanje storitev se uporabljata metodi getService() ali getByType(). Tako ustvarimo objekt UserController:

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

Med razvojem je koristno vklopiti način samodejnega osveževanja, pri katerem se vsebnik samodejno obnovi, če se spremeni kateri koli razred ali konfiguracijska datoteka. Samo navedite true kot drugi argument v konstruktorju ContainerLoader.

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

Uporaba z ogrodjem Nette

Kot smo pokazali, uporaba Nette DI ni omejena na aplikacije, napisane v ogrodju Nette, temveč jo lahko namestite kjer koli s samo tremi vrsticami kode. Če pa razvijate aplikacije v okolju Nette Framework, za konfiguracijo in ustvarjanje vsebnika poskrbi Bootstrap.