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 :
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 :
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é) :
Le code suivant crée une instance du conteneur DI selon la configuration stockée dans le fichier
config.neon
:
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
:
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
.
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.