Le blog du pangolin

Accueil > Programmation > PHP > Magento 2 > Magento 2 Tuto 2.3 - L’injection de dépendances

Magento 2 Tuto 2.3 - L’injection de dépendances

mardi 15 novembre 2016, par Super Pangolin

L’injection de dépendances

C’est un mécanisme qui permet d’instancier les classes dont nous avons besoin dans nos objets. Je vous laisse voir d’autres tutos pour le détail, il en existe de très bien faits et passons directement au vif du sujet : celui de magento.

Comme dans toute injection de dépendance, on place des factory dans les constructeurs de nos clases. Une factory est une classe qui suit un design pattern qui comprend une méthode de « construction » qui prend un type de classe en entrée et retourne une instance de cette classe.

L’injection de dépendances de magento 2

Dans magento, on a un « générateur de factory » qui est celui de symfony. Pour inclure une dépendance, on va ajouter dans le constructeur de notre classe un paramètre de type

Par exemple, si je veux une collection de produits, dont la classe est Magento\Catalog\Model\ResourceModel\Product\Collection

Mon factory magique sera : \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory

Si nous prenons l’exemple d’un bloc, nous aurons une déclaration semblable à ceci :

  1. <?php
  2. namespace Pangolin\ExtendedProducts\Block;
  3.  
  4. /**
  5.  * Block Message
  6.  */
  7. class Message extends \Magento\Framework\View\Element\Template
  8. {
  9.     /**
  10.      * var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
  11.      */
  12.     protected $_produceCollectionFactory;
  13.  
  14.     /**
  15.      * @var integer
  16.      */
  17.     private $nbProducts;
  18.  
  19.     /**
  20.      * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
  21.      */
  22.     public function __construct(\Magento\Framework\View\Element\Template\Context $context,
  23.         \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
  24.     ) {
  25.         $this->_produceCollectionFactory = $productCollectionFactory;
  26.         parent::__construct($context);
  27.     }
  28. }

Pour instancier notre collection, il suffit d’appeler la méthode « create() » :

  1.             /** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $productCollection */
  2.             $productCollection = $this→_produceCollectionFactory->create();

Magento a un mécanisme interne qui analyse tous les constructeurs de vos classes et génère les factory automatiquement dans le répertoire var/generation. Attention, si vous changez la déclaration d’un constructeur, magento génère une erreur. Il vous faudra supprimer le fichier correspondant à votre classe dans var/generation.

Les dépendances sont gérées dans des fichiers nommés di.xml. Par exemple, la configuration suivante :

  1. <preference for="Magento\Framework\View\ConfigInterface" type="Magento\Framework\View\Config" />

signifie que si on injecte la classe Magento\Framework\View\ConfigInterface dans un constructeur, on obtiendra une instance de la classe Magento\Framework\View\Config

Cette configuration est nécessaire également si vous étendez une classe native magento : les modules natifs instancieront votre classe et non plus la classe native si vous configurez cette préférence.

Voilà, c’est l’essentiel et c’est tout pour l’instant. Mais cet article est voué à s’étoffer.

Un message, un commentaire ?

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.