L’un des piliers de Magento 2 est son système d’injection de dépendances (Dependency Injection ou DI).
Grâce à lui, la plateforme reste flexible et évolutive. Mais ce système repose sur des fichiers parfois mystérieux : les fameux di.xml.
Ces fichiers contiennent la configuration de différents mécanismes tels que les plugins ou les observers. Cependant, certains éléments très importants au sein de ces mêmes fichiers prêtent souvent à confusion : <type> et <virtualType>.
Pourtant, elles sont essentielles pour personnaliser le comportement des services Magento sans modifier le code du cœur.
1. L’injection de dépendances en quelques mots
L’injection de dépendances consiste à fournir à une classe les objets dont elle a besoin, plutôt que de les créer directement dans la classe.
Autrement dit, Magento se charge d’instancier les dépendances et de les injecter automatiquement dans les constructeurs.
Exemple classique sans DI
class MyClass {
private $logger;
public function __construct() {
$this->logger = new Logger();
}
}
Dans cet exemple, la classe MyClass crée elle-même son Logger.
Résultat : difficile de remplacer cette dépendance par une autre implémentation sans modifier le code.
Exemple avec DI
class MyClass {
private $logger;
public function __construct(LoggerInterface $logger) {
$this->logger = $logger;
}
}
Grâce au di.xml, Magento peut décider quelle implémentation de LoggerInterface utiliser, sans que MyClass le sache.
Et c’est justement là que les balises <type> et <virtualType> entrent en jeu.
2. Le rôle de la balise <type>
La balise <type> permet de configurer une classe réelle existante dans le code PHP.
Elle sert à modifier les dépendances injectées ou à redéfinir certains arguments.
Exemple
<type name="Magento\Checkout\Model\Session">
<arguments>
<argument name="logger" xsi:type="object">My\Module\Logger\CheckoutLogger</argument>
</arguments>
</type>
Dans cet exemple :
namecorrespond à une classe réelle (Magento\Checkout\Model\Session).- On redéfinit simplement son argument
loggerpour utiliserCheckoutLogger.
Chaque fois que Magento créera un Magento\Checkout\Model\Session, il utilisera My\Module\Logger\CheckoutLogger à la place du logger par défaut.
3. Le rôle de la balise <virtualType>
La balise <virtualType> ressemble à <type>, mais avec une différence clé : elle ne correspond pas à une classe physique.
Un virtual type est une configuration dérivée d’une autre classe, permettant de créer une nouvelle “variante” sans créer de nouveau fichier PHP.
Exemple
<virtualType name="My\Module\Model\CustomSession" type="Magento\Checkout\Model\Session">
<arguments>
<argument name="logger" xsi:type="object">My\Module\Logger\CustomLogger</argument>
</arguments>
</virtualType>
Ici :
type="Magento\Checkout\Model\Session"indique que notre virtual type est basé sur cette classe.name="My\Module\Model\CustomSession"est le nom symbolique du type virtuel (il n’existe pas comme classe physique).
4. Cas concret : utiliser un virtual type dans un type
Prenons un exemple pratique :
Nous avons une classe PriceCalculator qui calcule des prix et log certaines informations.
Nous voulons lui injecter un logger spécial, avec un niveau de log spécifique (info, warning, debug), sans créer de nouvelle classe PHP.
Étape 1 : créer le virtual type
<virtualType name="My\Module\Model\DebugLogger" type="My\Module\Model\Logger">
<arguments>
<argument name="level" xsi:type="string">debug</argument>
</arguments>
</virtualType>
DebugLoggerest basé surLogger, mais son niveau de log est configuré surdebug.- Aucun fichier PHP supplémentaire n’est nécessaire.
Étape 2 : injecter le virtual type dans PriceCalculator via un <type>
<type name="My\Module\Model\PriceCalculator">
<arguments>
<argument name="logger" xsi:type="object">My\Module\Model\DebugLogger</argument>
</arguments>
</type>
De cette manière :
PriceCalculatorreçoit leDebugLoggerconfiguré,- Mais toutes les autres classes qui utilisent
Loggerne sont pas impactées.
5. Conclusion
<type>: configure une classe réelle existante.<virtualType>: crée une version configurée d’une classe existante, sans créer de fichier PHP.- Combinées, ces deux balises permettent de réutiliser et personnaliser les services Magento de manière propre et modulable.
Magento 2 tire une grande partie de sa puissance de son système d’injection de dépendances.
En utilisant <type> et <virtualType> dans le di.xml, vous pouvez créer des variantes de classes et ajuster leur comportement, tout en conservant un code propre et maintenable.

