Magento Olay Gözlemcileri: Singleton ve Model


45

Bu yüzden Magento bir gözlemci ilan etmenin 2 yolunu sunar. Singleton ve Model (yeni örnek) <type>Magento 1.x'deki etiketi belirterek ve sharedMagento 2'deki niteliği belirterek .

Magento yapmanın 1 yolu.

<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>

Magento 2 versiyonu:

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

Bu nedenle, Magento 1 örneğinde, <type>etiket model veya nesne ise, sınıf ile örneklendirilir Mage::getModel(). Eksikse singletonveya eksikse kullanarak başlatılır Mage::getSingleton().

Magento 2 olması durumunda, eğer sharedbir falseo kullanılarak örneği sınıfı $this->_observerFactory->create() (yeni bir örneği).
eğer shareddoğruysa o kullanarak örneği $this->_observerFactory->get()(singleton).

İki versiyon arasında olay gözlemcisi fikri çok benzerdir, ancak Magento 1'deki gözlemcilerin çoğu tekton olarak kullanılır, çünkü typeetiketi eksiktir ve gözlemcilerin çoğunun Magento 2'sinde (sanırım hepsi) shared="false".

Şaşırdım. Singletons'u ne zaman kullanmalıyım ve ne zaman gözlemciler için yeni örnekler kullanmalıyım?
Magento versiyonu (1 veya 2) burada önemli değil.
Basit bir kullanım durumu her yaklaşım için geçerlidir (yeni örnek veya singleton)


Ayrıca onunla mücadele ediyorum. typeÖzelliği hiç kullanmak gerekmese de , genellikle şimdi atlamak için.
Simon

@Simon genellikle atlarım. Hiçbir typeetiket aynı şey değildir <type>singleton</type>. Öyleyse gözlemcileri singleton haline getirmemizin nedeni nedir?
Marius

Bu gerçekten iyi bir soru. Bu yüzden onu abarttım. Sadece tamamen atlayabileceğinizi de belirtmek istedim.
Simon

Yanıtlar:


36

Gözlemcilere yönelik singleton'un bir anlam ifade edebileceği tek bir usecase var. Bu, birbirine bağlı iki olayı gözlemlediğinizde ve birincisi sırasında bir şey elde etmek istediğinizde, ancak ikincisi sırasında işlediğinizdir. Burada ayrıca kayıt defteri kullanabilirsiniz, ancak bu daha da küresel bir şey olurdu, bu yüzden singleton ve korumalı bir sınıf değişkeni iyi bir çözümdür.

Gerçekte bu neredeyse hiç olmuyor, ancak magento 1 ve 2 varsayılan olarak paylaşılan = true kullanıyor

Magento'da singleton'un varsayılan olmasının muhtemel nedeni: mikro-optimizasyon! Birisi, nesneleri tekrar tekrar yaratmaya gerek kalmaması için çok zaman kazandıracağını düşündü. Bir istek sırasında birkaç yüz kez denilen bazı olaylar için doğru olabilir, olayların kötü kullanılması durumunda bunu varsayılan olarak yapmak bile mantıklı olabilir.


5
Yeterince iyi bir açıklama gibi dikişler. . Ve şimdi bahsettiğinize göre, beni kafamda vurdu ... singleton'lar için gerçek bir kullanım davası: gözlemlemek istediğinizde _save_beforeve _save_afterve sonradan tasarruf etme eylemleri bir şeye bağlı _save_before. Duh! nasıl kaçırmış olabilirim?
Marius

"Bu, magento2 neden varsayılan olarak kullanılır = false" Bu yanlış. Magento 2 varsayılan olarak kullanırshared=true .
Mage2.PRO


thx, cevabı güncelledi
Flyingmana 14:15 '

1

Magento varsayılan olarak singleton'u kullanır, böylece kaynakları kutunun içine kaydeder. iki eşzamanlı işlem işletim ihtiyacı, verileri tek tek depolamak ve tutmak için gereken modele sahiptir. singleton'da nesne, yeni veriler yüklenir yüklenmez uçucu hale gelir.

Önceden magento 2.0, faydalanmak için paylaşılan nesneler kullanır .. magento 2.0, işi en kısa sürede temizlemeye devam eden çok iyi yazılmış yıkıcılara sahiptir!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.