Magento2 : 플러그인과 기본 설정의 기본 차이점은 무엇입니까?


47

magento2 튜토리얼에서 플러그인과 환경 설정을 모두 사용했으며 둘 다 정상적으로 작동하지만 기본적인 차이점은 무엇입니까?

플러그인 코드 :

1.1) di.xml에 플러그인 선언을 추가하십시오 :

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

1.2) 플러그인 클래스 생성

<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}

선호 코드 :

2.1) 환경 설정 선언을 작성하십시오.

<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />

2.2) 새 제품 클래스를 작성하십시오.

<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}

답변:


58

환경 설정은 Magento 1에서 클래스를 다시 작성하는 것과 같습니다 . " 코드가 필요할 때마다 대신 ClassA제공하십시오 "라고 말하는 것과 같습니다 MyClassB. MyClassB의 전체 구현 및 ClassA추가하거나 수정 한 모든 동작 이 예상됩니다 .

Magento 1에서와 같이 클래스를 수동으로 연결하지 않으면 ( MyClassB확장 OtherClassBOtherClassB확장 등 ClassA) 클래스에 대해 한 번에 하나의 기본 설정 (다시 쓰기) 만 활성화 할 수 있습니다 .

플러그인을 사용하면 연결하려는 클래스의 메소드 전후, 코드를 실행할 수 있습니다. 플러그인 클래스는 대상 클래스를 대체하지 않으며 인스턴스가 아닙니다. 당신은 방법이 before{method}, around{method}, after{method}대상 클래스에서 {방법}에 대하여에서 적절한 시간에 실행 얻을.

플러그인은 대상 클래스를 대체하지 않으므로 클래스에서 여러 플러그인을 동시에 활성화 할 수 있습니다. Magento는 XML의 sortOrder 매개 변수를 기반으로 한 번에 하나씩 실행합니다.

그 때문에 플러그인은 환경 설정보다 훨씬 유연합니다. 가능할 때마다 플러그인을 사용해야하며, 꼭 필요한 경우가 아니면 클래스를 다시 작성하기위한 환경 설정을 피하십시오.

플러그인의 작동 방식과 공식 문서 에서 플러그인 사용 방법에 대해 자세히 읽을 수 있습니다 .


선호도는 클래스 재 작성과 동일하지 않습니다. 인터페이스에 기본 구현을 제공하는 방법입니다.
KAndy

1
@KAndy 기본 의도 된 목적 일 수도 있지만, 그 부작용은 클래스 재정의에도 사용됩니다. 의미 적으로 그들은 동일합니다. 선호 사항을 통한 수업 재 작성은 Yogesh가 요구 한 사항이며, 그가 수행 한 기초 운동도 당신에게 지시합니다.
Ryan Hoerr

12

간단한 말로

기본 설정은 클래스를 재정의하는 데 사용됩니다.

플러그인은 기능 전후에 기능을 추가하는 데 사용됩니다.

예를 들어

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

코드가 ListProduct를 요청할 때마다 환경 설정에서

이봐, Vendor\MyModule\Block\Product\ListProduct 대신에 사용해 Magento\Catalog\Block\Product\ListProduct

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

코드가 getPrice ()를 요청할 때마다 플러그인은

이봐 getPrice() , 방법을 당신의 방법 전후에 사용하십시오.getPrice()


1

간단히 :

기본 설정은 인터페이스의 기본 구현을 지정하는 데 사용됩니다.

플러그인 (인터셉터)은 다른 클래스의 공용 메소드의 동작을 확장하는 데 사용됩니다.

상세히 :

기본 설정 : 인터페이스를 구현하는 클래스가 두 개 이상인 경우 구현 된 모든 클래스 중 기본 클래스를 지정해야합니다. 이는 종속성 주입 파일 (di.xml)의 환경 설정 노드를 통해 수행됩니다.

예 :

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

이 맵핑은에 app/etc/di.xml있으므로 오브젝트 관리자 는 전역 범위에 Magento\Core\Model\Url대한 요청이있는 경우 구현 클래스를 삽입합니다 Magento\Core\Model\UrlInterface.

플러그인 (인터셉터) :

예를 들어, 클래스 A에는 methodA확장 기능이 필요한 메소드 가 있습니다. 그런 다음 APlugin원래 클래스를 수정하지 않고 클래스 를 작성하여 플러그인을 통해 달성됩니다 A. 클래스 APlugin에는 필요한 메소드 이전, 이후 또는 주변에서 실행되는 메소드가 있습니다.

예 :

<config>
    <type name="Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock">
        <plugin name="showOutOfStockValueChanged" type="Magento\Catalog\Model\Plugin\ShowOutOfStockConfig"/>
    </type>
</config>

이 매핑은 app / etc / di.xml에 있습니다. 클래스 Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock메소드 중 하나 / 몇 개가 클래스 메소드 전후에 실행 Magento\Catalog\Model\Plugin\ShowOutOfStockConfig됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.