마 젠토 이벤트 옵저버 : 싱글 톤과 모델


45

Magento는 관찰자를 선언하는 두 가지 방법을 제공합니다. <type>Magento 1.x 에서 태그를 지정하고 sharedMagento 2 에서 속성 을 지정하여 싱글 톤 및 모델 (새 인스턴스)

마 젠토 1 가지 방법.

<events>
    <event_name>
        <observers>
            <unique_observer_name>
                <type>model|object|singleton|null</type>
                <class>class/alias_here</class>
                <method>methdNameHere</method>
            </unique_observer_name>
        </observers>
    </event_name>
</events>

마 젠토 2 버전 :

<event name="event_name">
    <observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>

따라서 Magento 1의 경우 <type>태그가 모델 또는 객체 인 경우 클래스는로 인스턴스화됩니다 Mage::getModel(). 그것의 경우 singleton또는 누락의 IT 사용하여 인스턴스화됩니다 Mage::getSingleton().

Magento 2의 경우 sharedis 인 경우 false클래스는 $this->_observerFactory->create() (새 인스턴스)를 사용하여 인스턴스화됩니다 .
경우 shared사실 그것은 사용하여 인스턴스화 $this->_observerFactory->get()(싱글 톤).

두 버전 사이에서 이벤트 옵저버 아이디어는 매우 유사하지만 type태그가 누락되고 마 젠토 2에서 대부분의 옵저버가 있기 때문에 마 젠토 1의 옵저버 대부분이 싱글 톤으로 사용됩니다 shared="false".

의아해 싱글 톤은 언제 사용해야하며 옵저버를 위해 언제 새 인스턴스를 사용해야합니까?
여기서 마 젠토 버전 (1 또는 2)은 중요하지 않습니다.
간단한 사용 사례는 각 접근 방식 (새 인스턴스 또는 싱글 톤)에 대해 수행합니다.


또한 어려움을 겪고 있습니다. type속성을 전혀 사용할 필요는 없지만 일반적으로 지금 건너 뜁니다.
시몬

@Simon 나는 보통 그것을 건너 뜁니다. type와 같은 태그가 없습니다 <type>singleton</type>. 그렇다면 관찰자를 싱글 톤으로 만드는 이유는 무엇입니까?
Marius

정말 좋은 질문입니다. 그래서 제가 그것을 찬성했습니다. 그냥 건너 뛸 수도 있다고 지적하고 싶었습니다.
Simon

답변:


36

관찰자에 대한 싱글 톤이 의미가있는 유스 케이스는 하나뿐입니다. 서로 의존하는 두 가지 이벤트를 관찰하고 첫 번째 이벤트 중에 무언가를 얻고 싶지만 두 번째 이벤트 중에 처리하려고합니다. 여기서 레지스트리를 사용할 수도 있지만 더 글로벌 한 것이므로 싱글 톤과 보호 된 클래스 변수가 좋은 솔루션입니다.

실제로 이것은 거의 일어나지 않지만 magento 1과 2는 기본적으로 shared = true를 사용합니다.

아마도 마 젠토에서 싱글 톤이 기본값 인 이유 : 마이크로 최적화! 누군가는 객체를 반복해서 만들 필요가 없기 때문에 너무 많은 시간을 절약 할 것이라고 생각했습니다. 요청 중 수백 번 호출되는 일부 이벤트의 경우에는 이벤트가 잘못 사용되는 경우이를 기본값으로하는 것이 합리적 일 수 있습니다.


5
충분한 설명처럼 솔기. . 그리고 당신이 그것을 언급 했으므로, 그것은 머리에서 나를 때렸습니다 ... 싱글 톤의 실제 사용 사례 : 관찰 _save_before하고 싶을 때 와 _save_after저장 후의 행동은의 무언가에 달려 있습니다 _save_before. 어이! 내가 어떻게 그것을 놓칠 수 있었습니까?
Marius

"즉, magento2가 기본적으로 shared = false를 사용하는 이유"이것은 잘못된 것입니다. 마 젠토 2 shared=true기본적으로 사용 합니다 .
Mage2.PRO


thx, 답변 업데이트
Flyingmana

1

Magento는 기본적으로 싱글 톤을 사용하므로 상자 안에 리소스를 저장합니다. 데이터를 개별적으로 저장하고 보유해야하므로 두 개의 동시 프로세스 운영 요구 모델. 싱글 톤에서는 새로운 데이터가로드 되 자마자 객체가 휘발성이됩니다.

magento 2.0은 공유 객체를 사용하여 활용합니다. magento 2.0에는 매우 잘 작성된 소멸자가있어 작업이 완료되는 즉시 메모리를 정리할 수 있습니다!

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