PHP Constructeur Injection


Exemple

Les objets dépendent souvent d'autres objets. Au lieu de créer la dépendance dans le constructeur, la dépendance doit être transmise au constructeur en tant que paramètre. Cela garantit qu'il n'y a pas de couplage étroit entre les objets et permet de modifier la dépendance à l'instanciation de classe. Cela présente un certain nombre d'avantages, notamment la lecture plus facile du code en rendant les dépendances explicites, et en simplifiant les tests car les dépendances peuvent être désactivées et simulées plus facilement.

Dans l'exemple suivant, Component dépend d'une instance de Logger , mais n'en crée pas. Il en faut un pour être passé en argument au constructeur.

interface Logger {
    public function log(string $message);
}

class Component {
    private $logger;

    public function __construct(Logger $logger) {
        $this->logger = $logger;
    }
}

Sans injection de dépendances, le code ressemblerait probablement à:

class Component {
    private $logger;

    public function __construct() {
        $this->logger = new FooLogger();
    }
}

L'utilisation de new pour créer de nouveaux objets dans le constructeur indique que l'injection de dépendance n'a pas été utilisée (ou n'a pas été utilisée de manière incomplète) et que le code est étroitement lié. C'est également un signe que le code est incomplètement testé ou peut avoir des tests fragiles qui font des hypothèses incorrectes sur l'état du programme.

Dans l'exemple ci-dessus, où nous utilisons l'injection de dépendance à la place, nous pourrions facilement passer à un autre enregistreur si cela devenait nécessaire. Par exemple, nous pouvons utiliser une implémentation Logger qui se connecte à un autre emplacement ou qui utilise un format de journalisation différent ou qui se connecte à la base de données plutôt qu'à un fichier.