문제

날짜:2015년 5월 30일 (Magento 2의 변화하는 특성을 고려).

마젠토 2 출시 플러그인 개념, 구현 인터셉터 패턴을 통해.

문서에서 명확하지 않은 것은 Magento의 어떤 클래스와 객체가 "인터셉트 가능"하다는 것입니다.즉, 다음과 같은 XML로 플러그인을 구성합니다.

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

하지만 어떤 클래스가 유효한지는 확실하지 않습니다. ObservedType.이것 오래된 위키 기사 라고 말할 때 몇 가지 단서를 제공합니다.

플러그인 기능은 적용되지 않습니다 -종속성 주입없이 생성 된 클래스, 즉 연산자가 직접적으로 직접 생성 된 클래스, -final Methods, -final Classe

~이다 어느 종속성 주입을 통해 생성된 객체를 가로챌 수 있습니까?는 ObservedType a에 제공된 유형 힌트여야 합니다. __construct 아니면 다른 것이 될 수 있나요(꼭 그래야 할까요?)?

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

도움이 되었습니까?

해결책

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

현재 위키에 설명된 대로 최종 메소드와 클래스에 의해 제한됩니다.

검증되지는 않았지만 라이브러리 클래스(lib 디렉터리)는 가로채는 것이 허용되지 않아야 합니다.

객체가 생성되는 방식에 대한 제한은 더 이상 사실이 아니라고 생각합니다. 적어도 오토로더가 올바르게 구성된 경우에는 그렇습니다.그리고 즉석에서 생성되는 것이 아니라 생성기가 실행될 때 중요하지 않습니다.(그래서 문제는 magento 자동 로더가 첫 번째여야 한다는 것입니다)

다른 팁

우리는 주석을 달기 위해 "@api" 주석을 작업 중입니다. 추천 릴리스 전반에 걸쳐 더 안정적인 방법입니다.업그레이드 가능성이 걱정된다면 추가로 무엇을 해야 할까요? ~할 수 있다 플러그인을 정의했다면 무엇을 고려해야 하는지도 고려해야 합니다. ~해야 한다 플러그인이 정의되어 있습니다.@api가 아닌 메서드를 가로채는 것은 권장되지 않지만 때로는 이것이 최선의 선택일 수도 있다는 것을 알고 있습니다.(개발자의 판단에 맡깁니다.)

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

나는 이것이 이미 답을 가지고 있다는 것을 알고 있지만 그것은 2년 전의 일입니다.어쩌면 그 사이에 어떤 것이 바뀌었을 수도 있습니다.

내가 지금까지 찾은 내용은 다음과 같습니다.
로부터 공식 문서 차단 과정을 파헤치는 것부터요.

나는 반대로 대답할 것이다.
무엇 할 수 없다 Magento 2에서 차단됩니다.
공식 문서에서

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

여기저기 파헤쳐보는 것부터

  • 개체 관리자를 통해 인스턴스화되지 않은 클래스의 메서드입니다.(예 \Magento\Framework\Phrase)
  • 구현하는 클래스 \Magento\Framework\ObjectManager\NoninterceptableInterface.(예를 들어 \Magento\Framework\App\Cache\Proxy 및 기타 모든 자동 생성 프록시)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top