문제

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

Magento 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 또는 누락되어 다음을 사용하여 인스턴스화됩니다. Mage::getSingleton().

마젠토2의 경우, shared ~이다 false 그런 다음 클래스는 다음을 사용하여 인스턴스화됩니다. $this->_observerFactory->create() (새 인스턴스).
만약에 shared 사실은 다음을 사용하여 인스턴스화됩니다. $this->_observerFactory->get() (하나씩 일어나는 것).

두 버전 사이의 이벤트 관찰자 아이디어는 매우 유사하지만 Magento 1의 관찰자 대부분은 싱글톤으로 사용됩니다. type 태그가 누락되었으며 Magento 2에서는 대부분의 관찰자가 shared="false".

나는 의아해한다. 언제 싱글톤을 사용해야 하며 언제 관찰자를 위한 새 인스턴스를 사용해야 합니까?
Magento 버전(1 또는 2)은 여기서 중요하지 않습니다.
간단한 사용 사례는 각 접근 방식(새 인스턴스 또는 싱글톤)에 적합합니다.

도움이 되었습니까?

해결책

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

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

magento에서 싱글톤이 기본값인 이유는 다음과 같습니다.미세 최적화!누군가는 객체를 반복해서 생성할 필요가 없기 때문에 시간이 너무 절약될 것이라고 생각했습니다.요청 중에 수백 번 호출되는 일부 이벤트의 경우 사실일 수 있으며, 이벤트를 잘못 사용하는 경우 기본값으로 수행하는 것이 합리적일 수도 있습니다.

다른 팁

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top