Mais pourquoi?

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
  • 8 possibilités parmis les noms choisis
  • Une solution gardée (la plus évidente)