Introduction à PHP-DI : qu'est-ce que c'est et pourquoi l'utiliser ?
PHP-DI (PHP Dependency Injection) est une bibliothèque puissante pour l'injection de dépendances (Dependency Injection, DI) dans les applications PHP. Elle implémente le pattern Inversion of Control (IoC) et fournit un conteneur pour résoudre automatiquement les dépendances entre les classes.
Pourquoi utiliser PHP-DI ? Dans les projets PHP modernes (notamment avec des frameworks comme Laravel, Symfony, Slim), les classes dépendent souvent d'autres classes. Sans conteneur DI, vous devez créer manuellement toutes les dépendances, ce qui entraîne :
- Un couplage fort du code (tight coupling)
- Des difficultés de test
- Une duplication de code lors de la création d'objets
- Des problèmes de maintenance et d'extension
PHP-DI résout ces problèmes en déterminant automatiquement les classes nécessaires à votre code et en les créant avec les bonnes dépendances. La bibliothèque prend en charge :
- L'injection automatique via le constructeur
- La définition des dépendances via des annotations (phpDoc)
- La configuration via des tableaux, YAML ou fichiers PHP
- Le chargement différé (lazy loading)
- L'intégration avec les frameworks populaires
Installation de PHP-DI
PHP-DI s'installe via Composer, le gestionnaire de paquets standard pour PHP :
composer require php-di/php-di
Si vous utilisez le framework Slim, installez le paquet d'intégration :
composer require php-di/slim-bridge
Pour Symfony, un paquet dédié est disponible :
composer require php-di/symfony-bridge
Après l'installation, incluez l'autoloader de Composer dans votre projet :
require __DIR__ . '/vendor/autoload.php';
Démarrage rapide avec un exemple de code
Prenons un exemple simple d'utilisation de PHP-DI. Supposons que nous ayons une classe Mailer qui dépend d'une classe Logger :
<?php
// Classe Logger
class Logger {
public function log($message) {
echo "[LOG]: " . $message . "\n";
}
}
// Classe Mailer qui dépend de Logger
class Mailer {
private $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function send($to, $subject) {
$this->logger->log("Envoi d'un email à {$to} : {$subject}");
// Logique d'envoi...
}
}
// Création du conteneur DI
$container = new DI\Container();
// Récupération de l'objet Mailer — toutes les dépendances sont résolues automatiquement
$mailer = $container->get('Mailer');
$mailer->send('user@example.com', 'Bonjour !');
?>
Dans cet exemple, PHP-DI crée automatiquement une instance de Logger et la transmet au constructeur de Mailer. Inutile d'écrire new Logger() — le conteneur le fait pour vous.
Méthodes et fonctions principales de PHP-DI
1. Container::get() — récupération d'un objet depuis le conteneur
Fonction : Extrait un objet par son nom (classe, interface ou alias) du conteneur. Si l'objet n'est pas encore créé, le conteneur le crée ainsi que toutes ses dépendances.
Paramètres :
string $name— nom de la classe, de l'interface ou alias
Exemple :
$container = new DI\Container();
$logger = $container->get('Logger'); // Crée et retourne un objet Logger
$mailer = $container->get('Mailer'); // Crée Mailer avec Logger à l'intérieur
2. Container::set() — enregistrement d'une définition
Fonction : Enregistre une définition pour une classe, une interface ou un alias. Permet de spécifier comment l'objet doit être créé.
Paramètres :
string $name— nom de la classe ou aliasmixed $definition— définition (chaîne, tableau, closure, objet Definition)
Exemple :
Aussi dans la bibliothèque
Configuration des applications C# (.NET) : Microsoft.Extensions.Configuration
Actix-web pour Rust : guide complet avec exemples
Traitement et analyse Markdown en PHP : bibliothèques et outils
Clap pour Rust : guide complet avec exemples