Magentoイベントオブザーバー:シングルトン対モデル
-
12-12-2019 - |
質問
SO Magentoはオブザーバーを宣言する2つの方法を提供しています。 Magento 1.xの<type>
タグを指定し、Magento 2でshared
属性を指定することで、シングルトンとモデル(新規インスタンス)。
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>
.
SO MASENTO 1の場合、<type>
タグがモデルまたはオブジェクトの場合、クラスはMage::getModel()
でインスタンス化されます。それがsingleton
であるかどうか、それが欠落しているのは、Mage::getSingleton()
を使用してインスタンス化されています。
Magento 2の場合、shared
がfalse
の場合、Classは$this->_observerFactory->create()
(New Instance)を使用してインスタンス化されます。
shared
が真の場合、それは$this->_observerFactory->get()
(Singleton)を使用してインスタンス化されます。
イベントオブザーバのアイデアは非常に似ていますが、type
タグが欠落していて、Magento 2でMagento 2ではマゼント1のオブザーバーのほとんどがシングルトンとして使用されています。
私は困惑しています。 いつシングルトンを使うべきですか、そしていつ観察者に新しいインスタンスを使うべきですか?
Magentoバージョン(1または2)はここで重要ではありません。
簡単なユースケースは各アプローチに対して行うことができます(新規インスタンスまたはシングルトン)
解決
オブザーバーのシングルトンが理にかなっているのは、ユースケースは1つだけです。あなたが互いに依存する2つのイベントを守るとき、あなたは最初のものの間に何かを取得したいのですが、それを2番目のイベント中に処理したいのです。ここでレジストリを使用することもできますが、それはさらにグローバルなので、シングルトンと保護されたクラス変数は良い解決策です。
現実の中ではほとんど起こりませんが、Magento 1と2はデフォルトでShared= True
おそらくシングルトンがマゼントでデフォルトである理由 マイクロ最適化! 誰かがオブジェクトを何度も何度も作成する必要がないほど多くの時間を節約するだろうと思いました。 要求の間に数百回呼ばれるいくつかのイベントにも当てはまる可能性がありますが、イベントの使用不良の場合のデフォルトとしてそれを実行するのは合理的です。
他のヒント
Magentoはデフォルトでシングルトンを使用してボックス内のリソースを保存します。データを個別に保存して保持する必要があるため、2つの同時プロセスの動作が必要です。シングルトンでは、新しいデータがロードされたらすぐにオブジェクトが揮発性を得ます。
上からMagento 2.0は、共有オブジェクトを使用して使用して使用します.. Magento 2.0は、ジョブが完了したらすぐにメモリを清掃し続けることが非常によく書かれています。