Accueil » Tous les articles » Magento 2 » Les classes virtuelles dans Magento 2

Les classes virtuelles dans Magento 2

L’introduction de l’injection de dépendances dont nous avons déjà parlé dans l’article sur les extensions dans Magento 2 et sur l’amélioration des performances dans Magento 2 permet un certain nombre de nouvelles choses. Parmi elles, il y a les classes virtuelles. Une classe virtuelle dans Magento 2 se basera sur une classe réelle dans laquelle sera injecté des paramètres différents de ceux par défaut afin de créer une nouvelle classe qui pourra être utilisée ailleurs. Cette approche permet de respecter le principe de responsabilité unique.

Regardons un peu du côté du checkout ce qui a été fait dans Magento_Checkout/etc/di.xml :

    <virtualType name="Magento\Checkout\Model\Session\Storage" type="Magento\Framework\Session\Storage">
        <arguments>
            <argument name="namespace" xsi:type="string">checkout</argument>
        </arguments>
    </virtualType>
    <type name="Magento\Checkout\Model\Session">
        <arguments>
            <argument name="storage" xsi:type="object">Magento\Checkout\Model\Session\Storage</argument>
        </arguments>
    </type>

Nous avons donc un type virtuel qui est créé avec le nom Magento\Checkout\Model\Session\Storage. Il reprend toutes les fonctionnalités de Magento\Framework\Session\Storage mais l’argument namespace va devenir checkout afin de le différencier des autres stockages de session.

Magento\Checkout\Model\Session\Storage sera une classe virtuelle. Dans les faits, une classe sera générée, si elle est nécessaire, par Magento.

class Storage extends \Magento\Framework\DataObject implements StorageInterface
{
    /**
     * Namespace of storage
     *
     * @var string
     */
    protected $namespace;

    /**
     * Constructor
     *
     * @param string $namespace
     * @param array $data
     */
    public function __construct($namespace = 'default', array $data = [])
    {
        $this->namespace = $namespace;
        parent::__construct($data);
    }

La classe Magento\Checkout\Model\Session\Storage va être une copie de Magento\Framework\Session\Storage, l’argument $namespace va prendre la valeur checkout si la première est instanciée.

Ainsi, on va pouvoir l’utiliser dans d’autres classes grâce à l’injection de dépendance. C’est ce qui est fait dans la deuxième partie de la déclaration xml précédente.

Dans le premier exemple, un seul argument est modifié mais il est possible d’en modifier plusieurs. Si on jette un œil à la classe virtuelle : Magento\Store\Model\ResourceModel\Group\Collection\FetchStrategy déclarée dans le xml du module store.


    <virtualType name="Magento\Store\Model\ResourceModel\Group\Collection\FetchStrategy" type="Magento\Framework\Data\Collection\Db\FetchStrategy\Cache">
        <arguments>
            <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Collection</argument>
            <argument name="cacheIdPrefix" xsi:type="string">app_</argument>
            <argument name="cacheTags" xsi:type="array">
                <item name="storeTag" xsi:type="const">Magento\Store\Model\Store::CACHE_TAG</item>
                <item name="configTag" xsi:type="const">Magento\Framework\App\Config::CACHE_TAG</item>
            </argument>
            <argument name="cacheLifetime" xsi:type="boolean">false</argument>
        </arguments>
    </virtualType>

Il est possible d’injecter une classe virtuelle dans une autre classe virtuelle. Cependant, si vous en êtes à vos débuts. Il est mieux de rester sur une virtualisation basique que de complexifier dès le départ.

Besoin d’aide pour mettre cela en place ?


Publié

dans

par

Commentaires

Laisser un commentaire