Magento 2:虚拟类型插件


8

Magento 2关于插件的文档让我感到困惑:

在此处输入图片说明

首先要说的是:

插件不能与虚拟类型一起使用

但后来说:

您可以将类,接口或虚拟类型指定为插件观察到的类型名称

我是否缺少某些内容,或者文档是否相互矛盾?我们可以为虚拟类型创建插件吗?


您能否告诉我您是否找到了正确的解决方案?您尚未将任何答复标记为“正确”。
Siarhey Uchukhlebau,2016年

1
@SiarheyUchukhlebau是的,我倾向于忘记将答案标记为正确。两个答案都是正确的。康提(Kandy)是Magento 2的开发人员,请检查他的回答;)
拉斐尔(Raphael)在Digital Pianism上2016年

magento.stackexchange.com/questions/111577/… 有什么方法可以使用插件覆盖此类。
阿米特·辛格

Answers:


4

插件将适用于虚拟类型,但前提是您为父类或接口指定了它,但您无法指定特定于具体虚拟类型的插件


因此,我们同意该文档不正确,因为它明确指定了虚拟类型。
拉斐尔(Raphael)在Digital Pianism上,2013年

3
老实说,虚拟类型的插件在开发人员Beta之前可用,我们有一些错误可以修复。
卡迪(Kandy)

magento.stackexchange.com/questions/111577/… 有什么方法可以使用插件覆盖此类。
阿米特·辛格

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代替virtualTypedoc #totrustornottotrustthedoc
Digital Pianism的Raphael在

更新了答案,以包含typevirtualType插件。
维奈

magento.stackexchange.com/questions/111577/… 有什么方法可以使用插件覆盖此类。
阿米特·辛格

您可以拦截虚拟类型映射到的具体类型,或者覆盖虚拟类型映射以映射到您自己的类,实际上为您提供了一种类覆盖。
维奈2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.