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.