Je suis en train de construire une application MVC en PHP (n'utilisant aucun framework). J'utilise yadif (https://github.com/beberlei/yadif) pour l'injection de dépendance.Adaptateurs et injection de dépendances
Je voudrais construire un module de connexion. Il devrait être capable d'utiliser des adaptateurs, par exemple on pourrait être en mesure de définir que les connexions sont authentifiées en utilisant la base de données MySQL ou un répertoire LDAP. Ce paramètre serait effectué dans la zone d'administration et stocké dans une base de données.
Je suppose que je devrais un adaptateur abstrait:
<?php
abstract AbstractLoginAdapter{
abstract function login($username, $pass){}
}
Je voudrais donc simplement mettre en œuvre des adaptateurs comme ceci:
<?php
MySQLLoginAdapter extends AbstractLoginAdapter{
public function login($username, $pass){
//do stuff
}
}
C'est tout beau et bien, mais comment puis-je créer une instance de l'adaptateur? En règle générale, les dépendances seraient injectées à l'aide yadif par le constructeur:
<?php
class loginController{
private $_adapter;
public function __construct(AbstractLoginAdapter $adapter){
$this->_adapter = $adapter;
}
}
Cependant, puisque je ne sais pas quel adaptateur béton sera injecté, je ne peux pas définir que dans une configuration avant la main. Yadif me permet de créer une configuration que je dois ensuite passer au conteneur:
$builder = new Yadif_Builder();
$builder->bind("loginController")
->to("loginController")
->args($SelectedLoginAdapter);
Depuis l'application utilise un contrôleur frontal, un conteneur de DI est créé là. Il crée ensuite un objet de routage, etc.
À la lumière de cela, dois-je passer une référence de ce conteneur vers le bas à l'objet loginController, et ensuite utiliser ce conteneur pour instancier mon adaptateur? Ou est-ce que je devrais instancier un nouveau conteneur dans mon objet loginController et charger juste dans une instance de l'adapteur?
Merci :) J'ai créé une classe abstraite similaire à ContainerAware que d'autres classes peuvent étendre.Le conteneur lui-même est ensuite automatiquement injecté dans cette classe au moment de l'exécution. Cela semble être beaucoup plus propre. – F21