Nette Documentation Preview

syntax
Conteneur Nette DI
******************

.[perex]
Nette DI est l'une des bibliothèques Nette les plus intéressantes. Elle peut générer et mettre à jour automatiquement des conteneurs DI compilés qui sont extrêmement rapides et étonnamment faciles à configurer.

Les services à créer par un conteneur DI sont généralement définis à l'aide de fichiers de configuration au [format NEON |neon:format]. Le conteneur que nous avons créé manuellement dans la [section précédente |container] serait écrit comme suit :

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

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

La notation est vraiment brève.

Toutes les dépendances déclarées dans les constructeurs des classes `ArticleFactory` et `UserController` sont trouvées et transmises par Nette DI elle-même grâce à ce que l'on appelle le [câblage automatique |autowiring], il n'est donc pas nécessaire de spécifier quoi que ce soit dans le fichier de configuration.
Ainsi, même si les paramètres changent, vous n'avez pas besoin de modifier quoi que ce soit dans la configuration. Nette régénérera automatiquement le conteneur. Vous pouvez alors vous concentrer uniquement sur le développement de l'application.

Si vous voulez passer des dépendances en utilisant des setters, utilisez la section [setup |services#setup] pour le faire.

Nette DI va directement générer le code PHP pour le conteneur. Le résultat est donc un fichier `.php` que vous pouvez ouvrir et étudier. Cela vous permet de voir exactement comment le conteneur fonctionne. Vous pouvez également le déboguer dans l'IDE et le parcourir. Et le plus important : le PHP généré est extrêmement rapide.

Nette DI peut également générer du code d'[usine |factory] basé sur l'interface fournie. Par conséquent, au lieu de la classe `ArticleFactory`, il nous suffit de créer une interface dans l'application :

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

Vous pouvez trouver l'exemple complet [sur GitHub |https://github.com/nette-examples/di-example-doc].


Utilisation en mode autonome .[#toc-standalone-use]
---------------------------------------------------

L'utilisation de la bibliothèque Nette DI dans une application est très simple. Tout d'abord, nous l'installons avec Composer (parce que le téléchargement de fichiers zip est tellement dépassé) :

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

Le code suivant crée une instance du conteneur DI selon la configuration stockée dans le fichier `config.neon`:

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

Le conteneur n'est généré qu'une seule fois, son code est écrit dans le cache (le répertoire `__DIR__ . '/temp'` ) et lors des requêtes suivantes, il n'est lu qu'à partir de celui-ci.

Les méthodes `getService()` ou `getByType()` sont utilisées pour créer et récupérer des services. C'est ainsi que l'on crée l'objet `UserController`:

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

Pendant le développement, il est utile d'activer le mode auto-refresh, où le conteneur est automatiquement régénéré si une classe ou un fichier de configuration est modifié. Il suffit de fournir `true` comme deuxième argument dans le constructeur de `ContainerLoader`.

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


Utilisation avec le cadre Nette .[#toc-using-it-with-the-nette-framework]
-------------------------------------------------------------------------

Comme nous l'avons montré, l'utilisation de Nette DI n'est pas limitée aux applications écrites dans le Nette Framework, vous pouvez le déployer n'importe où avec seulement 3 lignes de code.
Cependant, si vous développez des applications dans le Nette Framework, la configuration et la création du conteneur sont gérées par [Bootstrap |application:bootstrap#toc-di-container-configuration].

Conteneur Nette DI

Nette DI est l'une des bibliothèques Nette les plus intéressantes. Elle peut générer et mettre à jour automatiquement des conteneurs DI compilés qui sont extrêmement rapides et étonnamment faciles à configurer.

Les services à créer par un conteneur DI sont généralement définis à l'aide de fichiers de configuration au format NEON. Le conteneur que nous avons créé manuellement dans la section précédente serait écrit comme suit :

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

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

La notation est vraiment brève.

Toutes les dépendances déclarées dans les constructeurs des classes ArticleFactory et UserController sont trouvées et transmises par Nette DI elle-même grâce à ce que l'on appelle le câblage automatique, il n'est donc pas nécessaire de spécifier quoi que ce soit dans le fichier de configuration. Ainsi, même si les paramètres changent, vous n'avez pas besoin de modifier quoi que ce soit dans la configuration. Nette régénérera automatiquement le conteneur. Vous pouvez alors vous concentrer uniquement sur le développement de l'application.

Si vous voulez passer des dépendances en utilisant des setters, utilisez la section setup pour le faire.

Nette DI va directement générer le code PHP pour le conteneur. Le résultat est donc un fichier .php que vous pouvez ouvrir et étudier. Cela vous permet de voir exactement comment le conteneur fonctionne. Vous pouvez également le déboguer dans l'IDE et le parcourir. Et le plus important : le PHP généré est extrêmement rapide.

Nette DI peut également générer du code d'usine basé sur l'interface fournie. Par conséquent, au lieu de la classe ArticleFactory, il nous suffit de créer une interface dans l'application :

interface ArticleFactory
{
	function create(): Article;
}

Vous pouvez trouver l'exemple complet sur GitHub.

Utilisation en mode autonome

L'utilisation de la bibliothèque Nette DI dans une application est très simple. Tout d'abord, nous l'installons avec Composer (parce que le téléchargement de fichiers zip est tellement dépassé) :

composer require nette/di

Le code suivant crée une instance du conteneur DI selon la configuration stockée dans le fichier config.neon:

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

Le conteneur n'est généré qu'une seule fois, son code est écrit dans le cache (le répertoire __DIR__ . '/temp' ) et lors des requêtes suivantes, il n'est lu qu'à partir de celui-ci.

Les méthodes getService() ou getByType() sont utilisées pour créer et récupérer des services. C'est ainsi que l'on crée l'objet UserController:

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

Pendant le développement, il est utile d'activer le mode auto-refresh, où le conteneur est automatiquement régénéré si une classe ou un fichier de configuration est modifié. Il suffit de fournir true comme deuxième argument dans le constructeur de ContainerLoader.

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

Utilisation avec le cadre Nette

Comme nous l'avons montré, l'utilisation de Nette DI n'est pas limitée aux applications écrites dans le Nette Framework, vous pouvez le déployer n'importe où avec seulement 3 lignes de code. Cependant, si vous développez des applications dans le Nette Framework, la configuration et la création du conteneur sont gérées par Bootstrap.