맞춤 모듈에서 이벤트를 전달할 때


14

이것은 마 젠토 1과 마 젠토 2에 관한 질문입니다.

모범 사례로서 타사 모듈 개발자는 다른 모듈과 쉽게 작업 할 수 있도록 사용자 지정 모듈에 이벤트를 전달하는 것이 좋습니다.

나는 알고 싶다:

  • 개발자는 어디에서 사용자 정의 모듈에서 이벤트를 전달해야합니까?
  • 이벤트를 파견하기위한 추천 장소가 있습니까? 예를 들어 컨트롤러, 모델, 블록, 헬퍼, 옵저버?
  • 디스패치 이벤트가 성능에 어떤 영향을 미칩니 까?

예! 좋은 질문. 누구나이 질문에 대답하십시오. 사용자 지정 프로젝트뿐만 아니라 타사 확장 개발자에게도 매우 유용합니다.
mapaladiya

답변:


10

여기서 명확하고 명확한 결정 론적 대답을 찾지 못할 것입니다. 전반적으로 사용자와 사용자가 필요로하는 이벤트를 모듈에 전달해야합니다. 필요한 곳을 생각할 수 없으면 전달할 필요가 없습니다. Magento 자체는 많은 다른 장소 (컨트롤러 프리 / 포스트 디스패치, 크루 드 작업 등)에서 너무 많은 이벤트를 발생 시켜서 모듈은 사용자가 아무 것도하지 않고 많은 유용한 이벤트를 이미 디스패치 할 것입니다.

만족스럽지 않기 때문에 사용자가 원래 작업과 관계없이 사용자가 항목을 추가, 삭제, 변경 또는 별도의 작업을 수행 할 수 있도록 모듈에서 수행해야하는 작업이있을 때 모듈에서 이벤트를 전달하려고합니다. 예를 들어, Magento에는visitor_init 표준 자동 생성 이벤트 제품군에 속하지 않는 이벤트 가 있습니다. 이 이벤트를 통해 프로그래머는 Magento가 데이터를 기록하기 전에 방문자 개체를 수정할 수 있습니다. 이것은 원래 모듈 개발자가 결정적으로 수있는 방법이 아닙니다.여기에는 이벤트를 추가해야하는 곳이 있는데 기능 요청 및 / 또는 시스템 사용자와의 인터뷰에서 비롯된 것일 수 있습니다. 사용자가 원하는 것을 알고, 관리자를 통해 UI / UX를 구축 할 수 없거나 실용적이지 않은 경우 다른 프로그래머가이를 수행 할 수 있도록 이벤트 후크를 추가하십시오.

적은 sexily, 추가 이벤트도 (사용자, 또는 중 개발자를 가능하게하는 싼 방법이 될 수 있습니다 당신의 모든 사람의 걱정이 접촉하는 것을 코드의 울퉁불퉁 한 비트에 몇 가지 기능을 추가 할 팀). 당신 풍덩 dispatchEvent그것으로 코드, 후크의 중간에 전화를하고, 원래 범위에서 코드를 방해하지 않고 기능을 추가 할 수 있습니다. [편집자 : 또한 어느 시점에서 끔찍한 코드를 리팩터링해야합니다]

성능 측면에서 디스패치 할 이벤트 추가는 추가하는 위치에 따라 다릅니다. dispatch이벤트 를 호출 할 때 Magento는 몇 가지 추가 PHP 호출을 수행하고 구성된 관찰자의 구성을 쿼리 한 다음 관찰자를 호출해야합니다. 한 번 완료하면 표준 마 젠토 디스패치 범위에서 저렴하게 추가됩니다. 그러나 반복적으로 수행하면 (즉, 모든 블록 렌더 전에) 이것이 더해질 수 있습니다. 여기에는 좋은 규칙이 없습니다. 항상 정답은 프로필입니다.

마지막으로, Magento 2를 사용하면 아직 말하기가 너무 이릅니다. 위의 모든 사항이 여전히 적용되지만 플러그인 시스템에 약간의 주름이 생깁니다. 플러그인은 한 가지 관점에서 에서 Magento의 모든 공개 메소드 호출에 대한 동작과 같은 이벤트 작성 입니다. 이론적으로 수업을 올바르게 설계하는 경우 이벤트가 필요하지 않습니다. 그러나 실제로는 이벤트를 약간의 보호 또는 개인용 메소드 코드로 삭제하는 것이 대안이 긴 리팩토링 프로세스 인 경우 Magento 개발자에게 유혹적인 솔루션이 될 것입니다. 또한 특별히 명명 된 이벤트를 작성하면 모듈을 사용하는 개발자에게 친숙한 경험을 제공 할 수 있습니다.

희망이 도움이됩니다!


9

Magento 1의 경우 이벤트를 발생시키기에 좋은 시간은 모든 CRUD 작업 전후 및 렌더링 전후입니다. 이들 중 다수는 이미 핵심의 추상 클래스에 의해 제공되므로 실제로 많은 타사 이벤트가 필요하지는 않습니다.

Magento 2에서는 상황이 다릅니다. 공용 메소드 호출은 플러그인으로 인터셉트 될 수 있으므로 사용자 정의 이벤트가 더 이상 필요하지 않습니다.
클래스를 설계 할 때 단순히 모든 메소드를 공개하여 인터셉트 할 수있는 대신 큰 클래스를 여러 개의 작은 클래스로 분해하는 것이 좋습니다.
그러면 더 작은 클래스 각각에는 멋지게 명명되고 인터셉트 할 수있는 공개 메소드가 하나 또는 두 개있을 수 있습니다.


0

Vinai가 말했듯이 CRUD 작업 전후. 이벤트를 전달하는 또 다른 중요한 위치는 관리 가능한 양식 (관리 가능한 경우)입니다. 이렇게하면 관리 양식 블록을 다시 작성할 필요없이 사용자 정의 속성 / 필드를 추가 한 경우 새 입력 필드를 추가 할 수 있습니다. (마 젠토 1 용입니다.) 예를 참조하십시오


0

Magento 1 내에서 자동 발생 이벤트를 통해 이벤트를 활용할 수 있습니다. 모델 에서 $_eventPrefix$_eventObject속성을 설정 하기 만하면됩니다. 또한 컨트롤러의 'controller_action_predispatch_ ' . $this->getFullActionName()'controller_action_postdispatch_' . $this->getFullActionName()이벤트를 통해 사용자 지정 발생 컨트롤러 이벤트가 자동으로 발생합니다. 그것들은 대부분의 방법을 당신에게 줄 수 있습니다.

Magento 2의 경우, 메소드를 클래스 내부에 공개하십시오. 이를 통해 플러그인이 메소드를 가로 챌 수 있습니다. 이를 따르면 사용자 지정 이벤트를 만들 필요가 없습니다.

이게 도움이 되길 바란다!

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