Magento 2에서“인터셉트 가능 / 플러그인 가능”클래스


17

날짜 : 2015 년 5 월 30 일 (마 젠토 2의 변화하는 특성을 보임)

Magento 2 는 인터셉터 패턴을 통해 구현 된 플러그인 개념을 도입 했습니다 .

문서에서 분명하지 않은 것은 Magento의 어떤 클래스와 객체가 "절편 가능"한 것입니까? 즉, 다음과 같은 XML로 플러그인을 구성합니다.

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

그러나 어떤 클래스가 유효한지 확실하지 않습니다 ObservedType. 이 오래된 위키 기사 에서는 다음과 같은 힌트를 얻을 수 있습니다.

플러그인 기능은 종속성 주입없이 생성 된 클래스, 즉 연산자 new를 사용하여 직접 생성 한 클래스,-최종 메서드,-최종 클래스에는 적용되지 않습니다.

되어 있는 가능한 의존성 주입을 통해 생성 된 객체는 가로 챌 수? 메소드에 ObservedType제공된 유형 힌트가 필요 합니까 __construct, 아니면 다른 것이 될 수 있습니까?

주로 사용하기 전에 Magento 2 인터셉터로 수행 할 수있는 작업과 수행 할 수없는 작업에 대해 이해하려고 노력합니다.

답변:


10

Magento 모듈의 모든 클래스는 상호 캡쳐 가능합니다.

현재 위키에 설명 된대로 최종 방법 및 클래스에 의해 제한됩니다.

검증되지는 않았지만 라이브러리 클래스 (lib 디렉토리)는 차단 될 수 없습니다.

적어도 오토로더가 올바르게 구성되어 있다면 객체가 생성되는 방법에 대한 제한은 더 이상 사실이 아닙니다. 그리고 그들이 즉시 생성되지는 않지만 생성기가 실행될 때 중요하지 않아야합니다. (마 젠토 오토로더가 첫 번째 것이어야 함)


2
우리는 lib 클래스를 가로채는 데 제한이 없습니다. 또한 객체를 가로 챌 수 있으려면 ObjectManager (생성자 주입)를 사용하여 만들어야합니다.
Anton Kril 2018 년

1
매직 메소드 (phpdoc를 사용하여 선언)는 가로 챌 수 없습니다. 내 생각에 Varien_Object 스타일은 여전히 ​​일부 위치에 있습니다.
nevvermind 20시 07 분

11

릴리스 전체에서보다 안정적인 권장 방법에 주석을 달기 위해 "@api"주석을 작성 중입니다. 업그레이드 가능성에 대해 걱정할 경우 플러그인을 정의 할 수 있는 것 외에도 플러그인을 정의해야하는 것을 고려해야 합니다 . @api 이외의 방법을 가로채는 것을 권장하지 않지만 때로는 이것이 최선의 선택 일 수 있음을 알고 있습니다. (우리는 그것을 개발자의 재량에 맡깁니다.)

공식적으로 최종적이 아닌 공개 방법을 가로 챌 수 있습니다. 개인 방법은 확실히 작동하지 않습니다. 메모리에서 현재 가로 채기는 실제 클래스를 상속하는 하위 클래스를 작성하여 작동합니다 (종속성 주입 프레임 워크는 실제 클래스의 새 인스턴스를 요청할 때 생성 된 클래스의 인스턴스를 작성 함). 따라서 하위 클래스를 만들고 원래 메서드를 재정의 할 수있는 모든 것이 작동하지만 공개 메서드가 권장되므로 향후 다른 영리한 구현을 유연하게 사용할 수 있습니다 (이유가 없으면 현실적이지 않습니다) .


5

나는 이것이 이미 답을 가지고 있다는 것을 알고 있지만 2 년 전입니다. 그동안 변화가 있었을 수도 있습니다.

여기까지 내가 찾은 것이 있습니다.
로부터 공식 문서 및 차단 프로세스에 파고에서.

나는 다른 방법으로 대답 할 것입니다.
무슨 수없는 젠토 2에서 가로 챌 수
공식 문서에서

  • Magento \ Framework \ Interception이 인스턴스화되기 전에 인스턴스화 된 객체 (해당 지점이 확실하지 않음)
  • 최종 방법
  • 최종 클래스의 모든 메소드 (생성 된 인터셉터 클래스가 원래 클래스를 확장해야하기 때문에)
  • 하나 이상의 최종 공개 메소드를 포함하는 모든 클래스
  • 비공개 메소드 (보호 메소드에 대해서는 작동 할 수 있지만 클래스 외부에 비공개 메소드를 노출 시키므로 "윤리적"이 아님)
  • 정적 메소드
  • __ 구문
  • 가상 유형

발굴에서

  • 객체 관리자를 통해 인스턴스화되지 않은 클래스의 메소드 (예 \Magento\Framework\Phrase)
  • 구현하는 클래스 \Magento\Framework\ObjectManager\NoninterceptableInterface. (예를 들어 \Magento\Framework\App\Cache\Proxy다른 모든 자동 생성 프록시)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.