Magento 2: complementos de tipos virtuales

8

Estoy confundido por la documentación de Magento 2 con respecto a los complementos :

ingrese la descripción de la imagen aquí

Primero se dice que:

Los complementos no se pueden usar con tipos virtuales

Pero luego se dice que:

Puede especificar una clase, interfaz o tipo virtual como un nombre de tipo que el complemento observa

¿Me estoy perdiendo algo o la documentación se contradice a sí misma? ¿Podemos crear complementos para tipos virtuales?

Raphael en Digital Pianism
fuente
¿Podría, por favor, decirme si ha encontrado la solución correcta o no? No ha marcado ninguna de las respuestas como "correcta".
Siarhey Uchukhlebau
1
@SiarheyUchukhlebau, sí, tiendo a olvidar marcar las respuestas como correctas. Ambas respuestas son correctas. Kandy es un desarrollador de Magento 2, así que verifique su respuesta;)
Raphael en Digital Pianism
magento.stackexchange.com/questions/111577/… ¿Hay alguna forma de anular esta clase usando el complemento?
Amit Singh

Respuestas:

4

Los complementos funcionarán para el tipo virtual, pero solo si lo especifica para las clases o interfaces principales, pero no puede especificar el complemento específico para el tipo virtual concreto

Kandy
fuente
Por lo tanto, estamos de acuerdo en que el documento no es correcto, ya que dice especificar explícitamente el tipo virtual.
Raphael en Digital Pianism
3
Para ser honesto, los complementos en tipos virtuales funcionaron antes del desarrollador beta y tenemos un error para solucionarlo.
KAndy
magento.stackexchange.com/questions/111577/… ¿Hay alguna forma de anular esta clase usando el complemento?
Amit Singh
11

No, los complementos en tipos virtuales no funcionan.

Código de prueba de concepto:

<?php

namespace Training\Example\Model

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

Complemento usando <type>:

<?php

namespace Training\Example\Model;

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

Complemento usando <virtualType>:

<?php

namespace Training\Example\Model;

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

DI config:

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

Prueba:

    <?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
Vinaí
fuente
Supongo di.xmlque la etiqueta de declaración sería en typelugar de virtualTypeacuerdo con el documento #totrustornottotrustthedoc
Raphael en Digital Pianism
Actualizada la respuesta para incluir una typey virtualTypecomplemento.
Vinai
magento.stackexchange.com/questions/111577/… ¿Hay alguna forma de anular esta clase usando el complemento?
Amit Singh
Puede interceptar el tipo concreto al que se asigna el tipo virtual o, alternativamente, sobrescribir el mapeo de tipo virtual para asignarlo a su propia clase, de hecho, le da una especie de anulación de clase.
Vinai