Magento 2: plugin di tipi virtuali


8

Sono confuso dalla documentazione di Magento 2 relativa ai plugin :

inserisci qui la descrizione dell'immagine

In primo luogo si dice che:

I plug-in non possono essere utilizzati con tipi virtuali

Ma poi si dice che:

È possibile specificare una classe, un'interfaccia o un tipo virtuale come nome del tipo che il plugin osserva

Mi sto perdendo qualcosa o la documentazione si sta contraddicendo? Possiamo creare plugin per tipi virtuali?


Potresti dirmi se hai trovato la soluzione giusta o no? Non hai contrassegnato nessuna delle risposte come "corrette".
Siarhey Uchukhlebau,

1
@SiarheyUchukhlebau sì, tendo a dimenticare di contrassegnare le risposte come corrette. Entrambe le risposte sono corrette. Kandy è uno sviluppatore di Magento 2, quindi controlla la sua risposta;)
Raffaello al Pianismo digitale,

magento.stackexchange.com/questions/111577/… Esiste un modo per sovrascrivere questa classe usando il plugin.
Amit Singh,

Risposte:


4

I plug-in funzioneranno per il tipo virtuale ma solo se lo specifichi per le classi o le interfacce parent, ma non puoi specificare un plug-in specifico per il tipo virtuale concreto


Pertanto concordiamo sul fatto che il documento non è corretto in quanto afferma di specificare esplicitamente il tipo virtuale.
Raffaello al Pianismo digitale,

3
Ad essere onesti, i plug-in sui tipi virtuali hanno funzionato prima della beta degli sviluppatori e abbiamo un bug per risolverlo.
KAndy,

magento.stackexchange.com/questions/111577/… Esiste un modo per sovrascrivere questa classe usando il plugin.
Amit Singh,

11

No, i plug-in sui tipi virtuali non funzionano.

Prova del codice concettuale:

<?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__;
    }
}

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

Test:

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

Risultato:

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

Suppongo di.xmlche il tag di dichiarazione sarebbe typeinvece virtualTypesecondo il documento #totrustornottotrustthedoc
Raffaello al pianismo digitale,

Aggiornata la risposta per includere a typee virtualTypeplugin.
Vinai,

magento.stackexchange.com/questions/111577/… Esiste un modo per sovrascrivere questa classe usando il plugin.
Amit Singh,

È possibile intercettare il tipo concreto a cui sono mappate le mappe dei tipi virtuali o, in alternativa, sovrascrivere la mappatura dei tipi virtuali da mappare alla propria classe, in effetti offrendo una sorta di sostituzione della classe.
Vinai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.