Nette Documentation Preview

syntax
Nette DI konténer
*****************

.[perex]
A Nette DI az egyik legérdekesebb Nette könyvtár. Képes lefordított DI konténereket generálni és automatikusan frissíteni, amelyek rendkívül gyorsak és elképesztően könnyen konfigurálhatók.

A DI konténer által létrehozandó szolgáltatásokat általában [NEON formátumú |neon:format] konfigurációs fájlok segítségével határozzuk meg. Az [előző |container] szakaszban kézzel létrehozott konténer a következőképpen lenne leírva:

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

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

A jelölés valóban rövid.

A `ArticleFactory` és `UserController` osztályok konstruktoraiban deklarált összes függőséget maga a Nette DI találja meg és adja át az úgynevezett [autowiringnek |autowiring] köszönhetően, így a konfigurációs fájlban nem kell semmit sem megadni.
Tehát még ha a paraméterek változnak is, akkor sem kell semmit sem változtatni a konfigurációban. A Nette automatikusan újratermeli a konténert. Ott tisztán az alkalmazásfejlesztésre koncentrálhat.

Ha függőségeket akarsz átadni setterek segítségével, akkor használd a [setup |services#setup] szekciót erre a célra.

A Nette DI közvetlenül generálja a PHP kódot a konténerhez. Az eredmény így egy `.php` fájl, amelyet megnyithat és tanulmányozhat. Így pontosan láthatja, hogyan működik a konténer. Az IDE-ben is debugolhatod és végiglépkedhetsz rajta. És ami a legfontosabb: a generált PHP rendkívül gyors.

A Nette DI képes [gyári |factory] kódot is generálni a mellékelt interfész alapján. Ezért a `ArticleFactory` osztály helyett csak egy interfészt kell létrehoznunk az alkalmazásban:

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

A teljes példa megtalálható a [GitHubon |https://github.com/nette-examples/di-example-doc].


Önálló használat .[#toc-standalone-use]
---------------------------------------

A Nette DI könyvtár felhasználása egy alkalmazásban nagyon egyszerű. Először is telepítsük a Composer segítségével (mert a zip fájlok letöltése annyira elavult):

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

A következő kód létrehozza a DI konténer egy példányát a `config.neon` fájlban tárolt konfigurációnak megfelelően:

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

A konténer csak egyszer jön létre, kódja a gyorsítótárba (a `__DIR__ . '/temp'` könyvtárba) íródik, és a későbbi kéréseknél csak onnan olvassa be.

A `getService()` vagy a `getByType()` metódusok a szolgáltatások létrehozására és lekérdezésére szolgálnak. Így hozzuk létre a `UserController` objektumot:

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

A fejlesztés során hasznos engedélyezni az automatikus frissítési módot, amikor a konténer automatikusan újratermelődik, ha bármelyik osztály vagy konfigurációs fájl megváltozik. Csak adjuk meg a `true` címet második argumentumként a `ContainerLoader` konstruktorban.

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


Használat a Nette keretrendszerrel .[#toc-using-it-with-the-nette-framework]
----------------------------------------------------------------------------

Amint megmutattuk, a Nette DI használata nem korlátozódik a Nette Frameworkben írt alkalmazásokra, bárhol bevethető mindössze 3 sornyi kóddal.
Ha azonban a Nette Frameworkben fejlesztünk alkalmazásokat, a konténer konfigurálását és létrehozását a [Bootstrap |application:bootstrap#toc-di-container-configuration] kezeli.

Nette DI konténer

A Nette DI az egyik legérdekesebb Nette könyvtár. Képes lefordított DI konténereket generálni és automatikusan frissíteni, amelyek rendkívül gyorsak és elképesztően könnyen konfigurálhatók.

A DI konténer által létrehozandó szolgáltatásokat általában NEON formátumú konfigurációs fájlok segítségével határozzuk meg. Az előző szakaszban kézzel létrehozott konténer a következőképpen lenne leírva:

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

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

A jelölés valóban rövid.

A ArticleFactory és UserController osztályok konstruktoraiban deklarált összes függőséget maga a Nette DI találja meg és adja át az úgynevezett autowiringnek köszönhetően, így a konfigurációs fájlban nem kell semmit sem megadni. Tehát még ha a paraméterek változnak is, akkor sem kell semmit sem változtatni a konfigurációban. A Nette automatikusan újratermeli a konténert. Ott tisztán az alkalmazásfejlesztésre koncentrálhat.

Ha függőségeket akarsz átadni setterek segítségével, akkor használd a setup szekciót erre a célra.

A Nette DI közvetlenül generálja a PHP kódot a konténerhez. Az eredmény így egy .php fájl, amelyet megnyithat és tanulmányozhat. Így pontosan láthatja, hogyan működik a konténer. Az IDE-ben is debugolhatod és végiglépkedhetsz rajta. És ami a legfontosabb: a generált PHP rendkívül gyors.

A Nette DI képes gyári kódot is generálni a mellékelt interfész alapján. Ezért a ArticleFactory osztály helyett csak egy interfészt kell létrehoznunk az alkalmazásban:

interface ArticleFactory
{
	function create(): Article;
}

A teljes példa megtalálható a GitHubon.

Önálló használat

A Nette DI könyvtár felhasználása egy alkalmazásban nagyon egyszerű. Először is telepítsük a Composer segítségével (mert a zip fájlok letöltése annyira elavult):

composer require nette/di

A következő kód létrehozza a DI konténer egy példányát a config.neon fájlban tárolt konfigurációnak megfelelően:

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

A konténer csak egyszer jön létre, kódja a gyorsítótárba (a __DIR__ . '/temp' könyvtárba) íródik, és a későbbi kéréseknél csak onnan olvassa be.

A getService() vagy a getByType() metódusok a szolgáltatások létrehozására és lekérdezésére szolgálnak. Így hozzuk létre a UserController objektumot:

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

A fejlesztés során hasznos engedélyezni az automatikus frissítési módot, amikor a konténer automatikusan újratermelődik, ha bármelyik osztály vagy konfigurációs fájl megváltozik. Csak adjuk meg a true címet második argumentumként a ContainerLoader konstruktorban.

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

Használat a Nette keretrendszerrel

Amint megmutattuk, a Nette DI használata nem korlátozódik a Nette Frameworkben írt alkalmazásokra, bárhol bevethető mindössze 3 sornyi kóddal. Ha azonban a Nette Frameworkben fejlesztünk alkalmazásokat, a konténer konfigurálását és létrehozását a Bootstrap kezeli.