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

Les classes virtuelles dans Magento 2

    <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.


    <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