Magento 2: Plugins für virtuelle Typen

8

Ich bin verwirrt von der Magento 2-Dokumentation zu Plugins :

Geben Sie hier die Bildbeschreibung ein

Es wird zuerst gesagt, dass:

Plugins können nicht mit virtuellen Typen verwendet werden

Aber dann heißt es:

Sie können eine Klasse, eine Schnittstelle oder einen virtuellen Typ als Typnamen angeben, den das Plugin beobachtet

Vermisse ich etwas oder widerspricht sich die Dokumentation? Können wir Plugins für virtuelle Typen erstellen?

Raphael beim digitalen Pianismus
quelle
Können Sie mir bitte sagen, ob Sie die richtige Lösung gefunden haben oder nicht? Sie haben keine der Antworten als "richtig" markiert.
Siarhey Uchukhlebau
1
@SiarheyUchukhlebau Ja, ich vergesse oft, Antworten als richtig zu markieren. Beide Antworten sind richtig. Kandy ist ein Magento 2-Entwickler, also überprüfen Sie seine Antwort;)
Raphael bei Digital Pianism
magento.stackexchange.com/questions/111577/… Gibt es eine Möglichkeit, diese Klasse mithilfe des Plugins zu überschreiben ?
Amit Singh

Antworten:

4

Plugins funktionieren nur für virtuelle Typen, wenn Sie sie für übergeordnete Klassen oder Schnittstellen angeben. Sie können jedoch keine Plugins angeben, die für konkrete virtuelle Typen spezifisch sind

KAndy
quelle
Wir sind uns also einig, dass das Dokument nicht richtig ist, da es besagt, den virtuellen Typ explizit anzugeben.
Raphael bei Digital Pianism
3
Um ehrlich zu sein, funktionierten Plugins für virtuelle Typen vor der Entwickler-Beta und wir haben einen Fehler, der das Problem beheben kann.
KAndy
magento.stackexchange.com/questions/111577/… Gibt es eine Möglichkeit, diese Klasse mithilfe des Plugins zu überschreiben ?
Amit Singh
11

Nein, Plugins für virtuelle Typen funktionieren nicht.

Proof of Concept Code:

<?php

namespace Training\Example\Model

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

Plugin mit <type>:

<?php

namespace Training\Example\Model;

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

Plugin mit <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>

Prüfung:

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

Ergebnis:

Failed asserting that two strings are identical.
Expected :Training\Example\Model\VirtualTypePlugin
Actual   :Training\Example\Model\Type
Vinai
quelle
Ich würde davon ausgehen di.xmlDeklarationstag wäre typestatt virtualTypenach dem doc #totrustornottotrustthedoc
Raphael bei Digital Pianism
Aktualisierte die Antwort ein schließen typeund virtualTypePlug - in.
Vinai
magento.stackexchange.com/questions/111577/… Gibt es eine Möglichkeit, diese Klasse mithilfe des Plugins zu überschreiben ?
Amit Singh
Sie können den konkreten Typ abfangen, dem der virtuelle Typ zugeordnet ist, oder alternativ den virtuellen Typ überschreiben, um ihn Ihrer eigenen Klasse zuzuordnen, wodurch Sie eine Art Klassenüberschreibung erhalten.
Vinai