Magento 2: plugins de tipos virtuais

8

Estou confuso com a documentação do Magento 2 sobre plugins :

insira a descrição da imagem aqui

Diz-se primeiro que:

Plugins não podem ser usados ​​com tipos virtuais

Mas então diz-se que:

Você pode especificar uma classe, interface ou tipo virtual como um nome de tipo que o plug-in observe

Estou faltando alguma coisa ou a documentação está se contradizendo? Podemos criar plugins para tipos virtuais?

Raphael na Digital Pianism
fonte
Você poderia, por favor, me dizer se encontrou a solução certa ou não? Você não marcou nenhuma das respostas como "correta".
Siarhey Uchukhlebau
11
@SiarheyUchukhlebau yeah, eu costumo esquecer de marcar as respostas como corretas. Ambas as respostas estão corretas. Kandy é um desenvolvedor Magento 2 de modo a verificar a sua resposta;)
Raphael em Digital pianismo
magento.stackexchange.com/questions/111577/… Existe alguma maneira de substituir essa classe usando o plugin.
Amit Singh

Respostas:

4

Os plug-ins funcionarão para o tipo virtual, mas somente se você o especificar para classes ou interfaces pai, mas não poderá especificar um plug-in específico para o tipo virtual concreto

KAndy
fonte
Portanto, concordamos que o documento não está correto, pois diz para especificar explicitamente o tipo virtual.
Raphael no Digital Pianism
3
Para ser sincero, os plug-ins nos tipos virtuais funcionaram antes do desenvolvedor beta e temos um bug para corrigi-lo.
Kandy
magento.stackexchange.com/questions/111577/… Existe alguma maneira de substituir essa classe usando o plugin.
Amit Singh
11

Não, plugins em tipos virtuais não funcionam.

Prova de código conceitual:

<?php

namespace Training\Example\Model

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

Plugin usando <type>:

<?php

namespace Training\Example\Model;

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

Plugin usando <virtualType>:

<?php

namespace Training\Example\Model;

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

Configuração de 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>

Teste:

    <?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());
    }
}

Resultado:

Failed asserting that two strings are identical.
Expected :Training\Example\Model\VirtualTypePlugin
Actual   :Training\Example\Model\Type
Vinai
fonte
Eu suporia di.xmlque a tag de declaração seria em typevez de virtualTypeacordo com o doc #totrustornottotrustthedoc #
Rafael no Digital Pianism
Atualizada a resposta para incluir um typee virtualTypeplugin.
Vinai
magento.stackexchange.com/questions/111577/… Existe alguma maneira de substituir essa classe usando o plugin.
Amit Singh
Você pode interceptar o tipo concreto para o qual o tipo virtual mapeia ou sobrescrever o mapeamento de tipo virtual para mapear para sua própria classe, efetivamente fornecendo a você um tipo de substituição de classe.
Vinai