Nette Documentation Preview

syntax
Conteneur Nette DI
******************
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Conteneur Nette DI

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

La forme des services que le conteneur DI doit créer est généralement définie à l'aide de fichiers de configuration au format NEON. Le conteneur que nous avons créé manuellement dans le chapitre précédent s'écrirait ainsi :

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

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

La notation est vraiment concise.

Toutes les dépendances déclarées dans les constructeurs des classes ArticleFactory et UserController sont découvertes et passées automatiquement par Nette DI grâce à ce qu'on appelle l'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 rien à modifier dans la configuration. Le conteneur Nette se régénère automatiquement. Vous pouvez ainsi vous concentrer uniquement sur le développement de l'application.

Si nous voulons passer les dépendances via des setters, nous utilisons la section setup.

Nette DI génère directement le code PHP du conteneur. Le résultat est donc un fichier .php que vous pouvez ouvrir et étudier. Grâce à cela, vous voyez exactement comment fonctionne le conteneur. Vous pouvez également le déboguer dans votre IDE et le parcourir pas à pas. Et surtout : le PHP généré est extrêmement rapide.

Nette DI peut également générer du code pour les factories sur la base d'une interface fournie. Par conséquent, au lieu de la classe ArticleFactory, il nous suffira de créer uniquement une interface dans l'application :

interface ArticleFactory
{
	function create(): Article;
}

Vous trouverez l'exemple complet sur GitHub.

Utilisation autonome

Déployer la bibliothèque Nette DI dans une application est très facile. D'abord, nous l'installons avec Composer (car télécharger des zips 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 (répertoire __DIR__ . '/temp') et lors des requêtes suivantes, il est simplement chargé à partir de là.

Pour créer et obtenir des services, on utilise les méthodes getService() ou getByType(). C'est ainsi que nous créons l'objet UserController :

$controller = $container->getByType(UserController::class);
$controller->someMethod();

Pendant le développement, il est utile d'activer le mode de rafraîchissement automatique, où le conteneur se régénère automatiquement si une classe ou un fichier de configuration est modifié. Il suffit d'indiquer true comme deuxième argument dans le constructeur de ContainerLoader.

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

Utilisation avec le framework Nette

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