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?

Raphael chez Digital Pianism
la source
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

KAndy
la source
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
Vinai
la source
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