Magentoイベントオブザーバー:シングルトンとモデル


45

そのため、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タグと同じものはありません<type>singleton</type>。では、オブザーバーをシングルトンにしているのはなぜですか?
マリウス

それは確かに良い質問です。それが私がそれを支持した理由です。単にスキップすることもできることを指摘したかっただけです。
サイモン14

回答:


36

ユースケースは1つしかなく、オブザーバーのシングルトンが意味をなします。相互に依存する2つのイベントを観察し、最初のイベントでは何かを取得し、2番目のイベントではそれを処理したい場合。ここでもレジストリを使用できますが、それはさらにグローバルなものになるため、シングルトンと保護されたクラス変数は良い解決策です。

実際には、これはほとんど発生しませんが、magento 1および2はデフォルトでshared = trueを使用します

magentoでシングルトンがデフォルトである理由は、おそらく最適化です!誰かがオブジェクトを何度も作成する必要がなくなるので、時間を大幅に節約できると考えました。リクエスト中に数百回呼び出されるいくつかのイベントに当てはまる場合があります。イベントの不適切な使用の場合のデフォルトとしてそれを行うのが妥当であるかもしれません。


5
縫い目は十分な説明のようです。。そして今、あなたがそれを言及したので、それは私に頭を打ちました...シングルトンの本当のユースケース:あなたが観察_save_beforeしたいとき、_save_afterそして保存後のアクションはからの何かに依存してい_save_beforeます。ああ!どうして見逃したのでしょうか?
マリウス

「つまり、magento2がデフォルトでshared = falseを使用する理由」これは間違っています。Magento 2 shared=trueデフォルトで使用します
Mage2.PRO


thx、答えを更新
Flyingmana

1

Magentoはデフォルトでシングルトンを使用するため、ボックス内のリソースが節約されます。データを個別に保存および保持する必要があるため、2つの同時プロセスの運用ニーズモデル。シングルトンでは、オブジェクトは新しいデータがロードされるとすぐに揮発性になります。

最前線のmagento 2.0は、共有オブジェクトを使用して利用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.