Comment se retrouve t'on à faire une présentation sur l'intéropérabilité des containers d'injection de dépendance?
ABOUT ME
David Négrier
Directeur technique et cofondateur de TheCodingMachine, une SSII spécialisée dans les développements web.
A l'origine avec Matthieu Napoli (auteur de PHP-DI) de la proposition container-interop.
Passionné par le développement de frameworks PHP, lead developer de Mouf (http://mouf-php.com).
L'historique
2009: la vision
L'historique
Un constat
La gestion de l'instantiation des services n'est pas satisfaisante dans les frameworks PHP
Ma solution
Faire de l'injection de dépendance (comme en Java), mais graphiquement pour que ce soit facile
L'historique
2009
L'historique
2010
L'historique
2010
L'historique
2011
L'historique
2011
L'historique
2012
Pendant ce temps là...
Pendant ce temps là...
Mais au fait, c'est quoi l'injection de dépendance?
Avant
class MyController {
public function action() {
$logger = new Logger("monfichier.txt");
$logger->log("mon message");
}
}
Le logger est instantié à chaque fois... c'est pas terrible.
Il faudrait pouvoir l'instantier une seule fois.
Le singleton
class MyController {
public function action() {
$logger = Logger::getInstance();
$logger->log("mon message");
}
}
Ca parait mieux... en apparence seulement!
Le singleton
Le singleton
Référence à la classe en dur dans le code
Très problématique pour les librairies qui s'appuient vers d'autres librairies
Parfois, des classes censées être des singletons ne le sont pas partout (par exemple une connexion à la base de données)
La bonne solution
Injecter les objects depuis l'extérieur
class MyController {
private $logger;
public function __construct(LoggerInterface $logger) {
$this->logger = $logger;
}
public function action() {
$this->logger->log("mon message");
}
}
La bonne solution
Injecter des objets externes implique l'existence d'un fichier qui se charge de créer les instances
$logger = new Logger("monfichier.txt");
$myController = new MyController($logger);
...
Mais le fichier risque de grossir, grossir...
Les containers
Objectif des containers d'injection de dépendance: gérer les connexions entre les objets (le code spaghetti) de la manière la
plus propre possible.
Et il y a milles manières de faire cela!
Retour d'expérience
Une interface avec 2 méthodes triviales, ça met combien de temps à fabriquer?
Plus de deux ans depuis le lancement de la discussion sur PHP-FIG
3 mois de discussions juste pour le nom de l’interface
Plusieurs centaines de posts
Un pré-vote
Un vote
10 participants représentant les frameworks intéressés