Magento 2:仮想型プラグイン


8

プラグインに関するMagento 2のドキュメントに混乱しています

ここに画像の説明を入力してください

それは最初に言われた:

プラグインは仮想タイプでは使用できません

しかし、それはそれは言われています:

プラグインが監視するタイプ名として、クラス、インターフェース、または仮想タイプを指定できます

何か不足していますか、それともドキュメントがそれ自体と矛盾していますか?仮想タイプのプラグインを作成できますか?


あなたが正しい解決策を見つけたかどうか教えてください。返信に「正しい」のマークを付けていません。
Siarhey Uchukhlebau 16

1
@SiarheyUchukhlebauええ、正解をマークするのを忘れがちです。どちらも正解です。KandyはMagento 2の開発者なので、彼の答えを確認してください;)
デジタルピアニズムのラファエル2016

magento.stackexchange.com/questions/111577/… プラグインを使用してこのクラスをオーバーライドする方法はありますか?
Amit Singh 2017

回答:


4

プラグインは仮想タイプに対して機能しますが、それを親クラスまたはインターフェースに指定した場合のみですが、具象仮想タイプに固有のプラグインを指定することはできません


したがって、仮想型を明示的に指定するように指示されているため、ドキュメントが正しくないことに同意します。
デジタルピアニズムのラファエル、

3
正直なところ、仮想タイプのプラグインは開発者ベータ版より前に機能しましたが、修正するバグがあります。
KAndy

magento.stackexchange.com/questions/111577/… プラグインを使用してこのクラスをオーバーライドする方法はありますか?
Amit Singh

11

いいえ、仮想タイプのプラグインは機能しません。

概念実証コード:

<?php

namespace Training\Example\Model

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

使用するプラグイン<type>

<?php

namespace Training\Example\Model;

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

使用するプラグイン<virtualType>

<?php

namespace Training\Example\Model;

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

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>

テスト:

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

結果:

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

私が引き受けるdi.xml宣言タグは次のようになりtype代わりのvirtualTypeドキュメントの#totrustornottotrustthedocに応じて
デジタルPianismでラファエル

typevirtualTypeプラグインを含めるように回答を更新しました。
ビナイ

magento.stackexchange.com/questions/111577/… プラグインを使用してこのクラスをオーバーライドする方法はありますか?
Amit Singh 2017

仮想タイプがマップする具象タイプをインターセプトしたり、仮想タイプマッピングを上書きして独自のクラスにマップしたりして、実際には一種のクラスのオーバーライドを行うことができます。
ビナイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.