Magento 2 클래스 및 플러그인 재 작성


17

마 젠토 2는 마 젠토 1과 반대되는 플러그인 / 인터 셉션 / 인터셉터 의 개념을 가지고있다
. 어느 쪽이 좋습니까. 메소드의 기능을 대체하기 위해 플러그인을
사용할 수도 있습니다 around.
그러나 Magento 2는 여전히 M1 방식으로 클래스를 다시 작성할 가능성을 제공합니다.
플러그인을 사용하는 대신 클래스를 다시 작성하는 방법에 대한 몇 가지 예를보고 싶습니다.
핵심 보호 ​​방법의 동작을 변경하려고 할 때 유용하지만 재 작성이 권장되거나 필요한 다른 경우가 있습니까?


답변:


19

플러그인 대신 다시 쓰기를 사용하는 분명한 이유는 개인, 보호 또는 최종 방법 을 재정의해야 할 때입니다 입니다.

그러나 다음 시나리오도 고려하십시오.

첫 번째 시나리오 (절대 정렬 순서) :

플러그인 전에 코드를 실행 해야 할 때 다시 쓰기가 유용 할 수 있습니다 . plugin을 설정하여 수행 할 수 있다는 것을 알고 sortOrder있지만 누군가 (다른 사람이 아닌) 타사 구성 요소를 설치할 때 코드가 항상 첫 번째 코드가 될 것이라고 확신 할 수 없습니다.

두 번째 시나리오 (코드 제외) :

메소드에서 일부 코드 만 제외하거나 다시 작성 해야하는 경우 플러그인이 최적의 방법이 아닐 수 있습니다. around플러그인을 사용하고 호출을 피할 수 있다는 것을 알고 proceed있지만 스택의 다른 플러그인을 손상시킬 수 있습니다.

세 번째 시나리오 (코드 스타일) :

동작 을 다시 작성해야 할 때는 다시 작성을 사용해야하며, 플러그인을 사용 하여 출력수정해야합니다. 하거나 코드를 실행 전후에 실행 .

플러그인 다른 모듈이 손상되지 않도록 항상 원래 코드실행해야 합니다.

내 결론 :

핵심 방법을 입력과 하나의 출력을 가진 블랙 박스 로 간주 할 수 있고 내부 메커니즘에 대해 무관심한 경우 플러그인이 가장 좋습니다.

내부 동작변경 해야하는 경우 다시 쓰기가 가장 좋습니다.


첫 번째 시나리오는 실제 메소드 코드 전에 이전 또는 arround 플러그인이 실행되거나 실행 가능하기 때문에 약간 정확하지 않습니다 (단어라고 생각합니다).
David Verholen

예, 내 말이 정확하지 않습니다. 내 요점은 실제 방법을 사용한 상대 정렬 순서에 관한 것입니다.
Phoenix128_RiccardoT

7

좋은 질문, 나는 다른 날 자신에게 같은 것을 물었고 여기에 내가 생각해 낸 것이 있습니다.

  • 첫째, 의존성 주입없이 생성 된 최종 메소드, 최종 클래스 및 클래스 에는 플러그인을 사용할 수 없습니다 . 매우 특별한 경우이지만 플러그인을 사용할 수없는 경우라고 생각합니다.
  • 둘째, 플러그인의 정의를 명심해야합니다. 메소드 레벨에서 작업하는 데 사용되는 반면 환경 설정은 전체 클래스 레벨에서 작업하는 데 사용됩니다. 모든 사람에게 명백한 것은 아니므로이를 명심하는 것이 좋습니다.
  • 마지막으로, 그것이 가장 중요하다고 생각합니다. 플러그인은 Magento 클래스 내에서 공용 메소드의 동작을 확장하는 데만 사용할 수있는 것 같습니다 . 따라서 protected / private 메소드와 함께 플러그인을 사용할 수없는 것 같습니다 .

출처 : 마 젠토 U 기초 과정


2
확인. 좋은 이유가 있습니다. 그래도 두 번째 요점에 대해 무엇을 말할지 모르겠습니다. 같은 클래스에서 많은 공개 메소드를 플러그인하려면 가장 안전한 방법은 모든 클래스의 플러그인 역할을하는 단일 클래스를 만드는 것입니다. (나의 의견). 누군가 다른 이유가 있는지 확인하기 위해 2-3 일 동안 열어 두겠습니다. 그렇지 않은 경우 ... 체크 표시가 귀하의 것입니다.
Marius

@Marius 당신은 절대적으로 다시 맞습니다 : 두 번째 포인트. 어떤 이유로 든 플러그인하려는 모든 메소드에 대해 여러 개의 플러그인 파일을 만들어야한다고 생각했지만 플러그인이 아닌 관찰자가하는 것입니다. 더 많은 사람들이 더 많은 이유가 있는지 알아보기 위해 대답하면 멋지다 (명확하지 않음).
디지털 피아니즘의 Raphael

1
@marius는 추가 사항 : 플러그인은 도메인마다 다르므로 동일한 기능을 구현하는 경우 하나의 클래스에 여러 플러그인을 정의하는 것이 가장 좋습니다. 다시 작성하면 항상 전체 클래스를 변경하므로이 옵션이 없습니다. 그래서 나는 이것이 최소한 재 작성을 피하려고 노력하는 한 가지 이유라고 생각합니다
David Verholen

@DavidVerholen 전적으로 동의합니다. 그러나 플러그인 대신 다시 쓰기를 사용해야하는 이유를 묻고있었습니다.
Marius

네, 기능별 플러그인 클래스를 정의 할 수 있기 때문에 이것이 플러그인을 사용하는 이유라고 생각합니다. 다시 쓰기는 한 번만 수행 할 수 있습니다.
David Verholen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.