そのため、Magentoはオブザーバーを宣言する2つの方法を提供します。シングルトンとモデル(新しいインスタンス)<type>
。Magento1.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>
Magento 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()
。
Magentoの2の場合には、IFがshared
ありfalse
、その後使用してインスタンス化されたクラス$this->_observerFactory->create()
(新しいインスタンス)。trueの
場合、(シングルトン)shared
を使用してインスタンス化されます$this->_observerFactory->get()
。
2つのバージョン間でのイベントオブザーバーの考え方は非常に似ていますが、Magento 1のほとんどのオブザーバーはシングルトンとして使用されます。type
タグがないため、Magento 2のほとんど(すべて)がオブザーバーshared="false"
です。
私は困惑しています。いつシングルトンを使用し、オブザーバーに新しいインスタンスを使用する必要がありますか?
Magentoバージョン(1または2)はここでは重要ではありません。
シンプルなユースケースは、各アプローチ(新しいインスタンスまたはシングルトン)で行います
type
タグと同じものはありません<type>singleton</type>
。では、オブザーバーをシングルトンにしているのはなぜですか?
type
属性を使用する必要はまったくありませんが、通常はスキップします。