Magento 2: plugin jenis virtual

8

Saya bingung dengan dokumentasi Magento 2 tentang plugin :

masukkan deskripsi gambar di sini

Pertama-tama dikatakan bahwa:

Plugin tidak dapat digunakan dengan tipe virtual

Tetapi kemudian dikatakan bahwa:

Anda bisa menentukan kelas, antarmuka, atau tipe virtual sebagai nama jenis yang diamati plugin

Apakah saya kehilangan sesuatu atau dokumentasi itu bertentangan dengan dirinya sendiri? Bisakah kita membuat plugin untuk tipe virtual?

Raphael di Digital Pianism
sumber
Bisakah Anda memberi tahu saya apakah Anda sudah menemukan solusi yang tepat atau tidak? Anda belum menandai salah satu balasan sebagai "benar".
Siarhey Uchukhlebau
1
@SiarheyUchukhlebau ya saya cenderung lupa untuk menandai jawaban sebagai benar. Kedua jawaban itu benar. Kandy adalah pengembang Magento 2 jadi periksa jawabannya;)
Raphael di Digital Pianism
magento.stackexchange.com/questions/111577/... Apakah ada cara untuk mengganti kelas ini menggunakan plugin.
Amit Singh

Jawaban:

4

Plugin akan bekerja untuk tipe virtual tetapi hanya jika Anda menentukannya untuk kelas atau antarmuka induk, tetapi Anda tidak dapat menentukan plugin spesifik untuk tipe virtual konkret

KAndy
sumber
Jadi kami setuju bahwa dokumen tersebut tidak benar seperti yang dikatakan untuk secara spesifik menentukan tipe virtual.
Raphael di Digital Pianism
3
Sejujurnya, plugin pada tipe virtual berfungsi sebelum pengembang beta dan kami memiliki bug untuk memperbaikinya.
KAndy
magento.stackexchange.com/questions/111577/... Apakah ada cara untuk mengganti kelas ini menggunakan plugin.
Amit Singh
11

Tidak, plugin pada tipe virtual tidak berfungsi.

Bukti kode konsep:

<?php

namespace Training\Example\Model

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

Plugin menggunakan <type>:

<?php

namespace Training\Example\Model;

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

Plugin menggunakan <virtualType>:

<?php

namespace Training\Example\Model;

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

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

Uji:

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

Hasil:

Failed asserting that two strings are identical.
Expected :Training\Example\Model\VirtualTypePlugin
Actual   :Training\Example\Model\Type
Vinai
sumber
Saya akan menganggap di.xmltag deklarasi akan menjadi typebukan virtualTypemenurut doc #totrustornottotrustthedoc
Raphael di Digital Pianism
Memperbarui jawaban untuk menyertakan a typedan virtualTypeplugin.
Vinai
magento.stackexchange.com/questions/111577/... Apakah ada cara untuk mengganti kelas ini menggunakan plugin.
Amit Singh
Anda bisa mencegat tipe beton peta tipe virtual, atau menimpa pemetaan tipe virtual untuk memetakan ke kelas Anda sendiri, yang pada dasarnya memberi Anda semacam override kelas.
Vinai