Magento 2: plugins de types virtuels


8

Je suis confus par la documentation de Magento 2 concernant les plugins :

entrez la description de l'image ici

Il est d'abord dit que:

Les plugins ne peuvent pas être utilisés avec des types virtuels

Mais alors, il est dit que:

Vous pouvez spécifier une classe, une interface ou un type virtuel comme nom de type que le plugin observe

Suis-je en train de manquer quelque chose ou la documentation se contredit-elle? Pouvons-nous créer des plugins pour les types virtuels?


Pourriez-vous, s'il vous plaît, me dire si vous avez trouvé la bonne solution ou non? Vous n'avez marqué aucune réponse comme «correcte».
Siarhey Uchukhlebau

1
@SiarheyUchukhlebau ouais j'ai tendance à oublier de marquer les réponses comme correctes. Les deux réponses sont correctes. Kandy est un développeur de Magento 2 alors vérifiez sa réponse;)
Raphael au Digital Pianism

magento.stackexchange.com/questions/111577/… Existe-t-il un moyen de remplacer cette classe à l'aide du plugin.
Amit Singh

Réponses:


4

Les plugins fonctionneront pour le type virtuel mais uniquement si vous le spécifiez pour les classes ou interfaces parent, mais vous ne pouvez pas spécifier de plugin spécifique pour le type virtuel concret


Nous convenons donc que le document n'est pas correct car il dit de spécifier explicitement le type virtuel.
Raphael au Digital Pianism

3
Pour être honnête, les plugins sur les types virtuels fonctionnaient avant la version bêta du développeur et nous avons un bug pour le corriger.
KAndy

magento.stackexchange.com/questions/111577/… Existe-t-il un moyen de remplacer cette classe à l'aide du plugin.
Amit Singh

11

Non, les plugins sur les types virtuels ne fonctionnent pas.

Code de preuve de concept:

<?php

namespace Training\Example\Model

class Type
{
    public function bar()
    {
        return __CLASS__;
    }
}

Plugin utilisant <type>:

<?php

namespace Training\Example\Model;

class TypePlugin
{
    public function afterBar(Type $subject)
    {
        return __CLASS__;
    }
}

Plugin utilisant <virtualType>:

<?php

namespace Training\Example\Model;

class VirtualTypePlugin
{
    public function afterBar(Type $subject)
    {
        return __CLASS__;
    }
}

Configuration DI:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="Foo" type="Training\Example\Model\Type">
        <plugin name="myfoo" type="Training\Example\Model\VirtualTypePlugin"/>
    </virtualType>
    <type name="Foo">
        <plugin name="yourfoo" type="Training\Example\Model\TypePlugin"/>
    </type>
</config>

Tester:

    <?php

namespace Training\Example\Training\Integration;

use Magento\TestFramework\ObjectManager;
use Training\Example\Model\Type;
use Training\Example\Model\VirtualTypePlugin;

class VirtualTypePluginTest extends \PHPUnit_Framework_TestCase
{
    public function testPluginsOnVirtualTypesWork()
    {
        /** @var Type $instance */
        $instance = ObjectManager::getInstance()->create(Type::class);
        $this->assertSame(VirtualTypePlugin::class, $instance->bar());
    }
}

Résultat:

Failed asserting that two strings are identical.
Expected :Training\Example\Model\VirtualTypePlugin
Actual   :Training\Example\Model\Type

Je suppose que la di.xmlbalise de déclaration serait typeau lieu de virtualTypeselon le document #totrustornottotrustthedoc
Raphael au Digital Pianism

Mise à jour de la réponse pour inclure un plugin typeet virtualType.
Vinai

magento.stackexchange.com/questions/111577/… Existe-t-il un moyen de remplacer cette classe à l'aide du plugin.
Amit Singh

Vous pouvez intercepter le type concret auquel le type virtuel est mappé, ou remplacer le mappage de type virtuel pour le mapper à votre propre classe, ce qui vous donne en fait une sorte de remplacement de classe.
Vinai
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.