Magento 2: plugin loại ảo


8

Tôi bối rối bởi tài liệu Magento 2 liên quan đến plugin :

nhập mô tả hình ảnh ở đây

Đầu tiên người ta nói rằng:

Plugin không thể được sử dụng với các loại ảo

Nhưng sau đó người ta nói rằng:

Bạn có thể chỉ định một lớp, giao diện hoặc loại ảo làm tên loại mà plugin quan sát

Tôi đang thiếu một cái gì đó hoặc là tài liệu mâu thuẫn với chính nó? Chúng ta có thể tạo plugin cho các loại ảo không?


Bạn có thể, xin vui lòng, cho tôi biết liệu bạn đã tìm thấy giải pháp đúng hay chưa? Bạn chưa đánh dấu bất kỳ câu trả lời nào là đúng.
Siarhey Uchukhlebau

1
@SiarheyUchukhlebau yeah tôi có xu hướng quên đánh dấu câu trả lời là đúng. Cả hai câu trả lời đều đúng. Kandy là một nhà phát triển Magento 2 vì vậy hãy kiểm tra câu trả lời của anh ấy;)
Raphael tại Digital Pianism

magento.stackexchange.com/questions/111577/. Có cách nào để ghi đè lớp này bằng cách sử dụng plugin.
Amit Singh

Câu trả lời:


4

Plugin sẽ hoạt động cho loại ảo nhưng chỉ khi bạn chỉ định nó cho các lớp hoặc giao diện cha mẹ, nhưng bạn không thể chỉ định plugin cụ thể cho loại ảo cụ thể


Vì vậy, chúng tôi đồng ý rằng tài liệu không đúng như đã nói để chỉ định rõ ràng loại ảo.
Raphael tại Nghệ thuật piano kỹ thuật số

3
Thành thật mà nói, các plugin trên các loại ảo đã hoạt động trước bản beta của nhà phát triển và chúng tôi có lỗi để sửa nó.
KAndy

magento.stackexchange.com/questions/111577/. Có cách nào để ghi đè lớp này bằng cách sử dụng plugin.
Amit Singh

11

Không, plugin trên các loại ảo không hoạt động.

Bằng chứng về mã khái niệm:

<?php

namespace Training\Example\Model

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

Plugin sử dụng <type>:

<?php

namespace Training\Example\Model;

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

Plugin sử dụng <virtualType>:

<?php

namespace Training\Example\Model;

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

Cấu hình 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>

Kiểm tra:

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

Kết quả:

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

Tôi cho rằng di.xmlthẻ khai báo sẽ typethay vì virtualTypetheo tài liệu #totrustornottotrustthedoc
Raphael tại Digital Pianism

Cập nhật câu trả lời để bao gồm một typevirtualTypeplugin.
Vinai

magento.stackexchange.com/questions/111577/. Có cách nào để ghi đè lớp này bằng cách sử dụng plugin.
Amit Singh

Bạn có thể chặn loại cụ thể ánh xạ loại ảo sang hoặc ghi đè lên ánh xạ loại ảo để ánh xạ tới lớp của riêng bạn, thực tế mang lại cho bạn một loại ghi đè lớp.
Vinai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.