Magento 1:なぜいくつかのオブザーバーメソッドがgetEvent()を呼び出し、一部は呼び出さないのですか?


8

最近気づいたこと、それについて知りたいです。

例1:の使用 getEvent()

ではMage_Core_Model_LocaleではsetLocale()この方法、イベントが送出されます。

Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));

このイベントのためのオブザーバーがあるbindLocale()からMage_Adminhtml_Model_Observer

public function bindLocale($observer)
{
    if ($locale=$observer->getEvent()->getLocale()) {
        if ($choosedLocale = Mage::getSingleton('adminhtml/session')->getLocale()) {
            $locale->setLocaleCode($choosedLocale);
        }
    }
    return $this;
}

ご覧のとおり、ロケールを取得するには、最初getEvent()にオブザーバーを呼び出します。

例2:なし getEvent()

ではMage_Wishlist_Block_Customer_Wishlist_Item_Optionsでは__construct()この方法、イベントが送出されます。

Mage::dispatchEvent('product_option_renderer_init', array('block' => $this));

したがって、例1と2に同じ構文を使用することに同意します。

しかしながら、この第二例えば観察者があるinitOptionRenderer()からMage_Bundle_Model_Observer

public function initOptionRenderer(Varien_Event_Observer $observer)
{
    $block = $observer->getBlock();
    $block->addOptionsRenderCfg('bundle', 'bundle/catalog_product_configuration');
    return $this;
}

ご覧のとおり、ブロックを取得するためgetEvent()に、オブザーバーを呼び出しません

質問

  • getEvent()例1でメソッドが呼び出されるのはなぜですか?または、なぜgetEvent()例2で呼び出されないのですか?
  • getEvent()メソッドの目的は何ですか?
  • どこで使用すべきか、どこで使用getEvent()すべきか?

回答:


7

これにはおそらく歴史的な理由があり、1.0リリースを超えて遡ります。

Varien_Event目的は、コンクリートイベントのためのパラメータを格納する論理的な場所であるが、Magentoのが通過するためVarien_Observer、すべてのオブザーバメソッドへのショートカットのアクセスをオブジェクトのパラメータは、理にかなって(そしてそれが少なくとも1.1以来がありました)。

現在使用されている 2つの異なるオブジェクトには、実際には値がありません。

しかし、それは当初からそのように計画されていなかったことは明らかです。メソッドMage::addObserver()では、<args>XMLノードからのイベントとオブザーバーの名前と静的引数だけでなく、コールバックも設定されます。

$observer->setName($observerName)->addData($data)->setEventName($eventName)->setCallback($callback);

このようにして、オブザーバーはを使用して自分自身を派遣でき$observer->dispatch($event)ます。その場合、オブザーバーは自分自身にイベントデータを持たず、それにgetEvent()アクセスするためにを使用する必要があります。ただし、この方法はどこでも使用されないため、実際には問題になりません。

いくつかのソフトウェア考古学を実践してさらに掘り下げたい場合は、のように、最終的な製品にはなれなかったオリジナルのアイデアを示唆するデッドコードがさらに見つかりますVarien_Event_Observer_Collection


ありがとうございました。「歴史的」側面について言及しようとしていました。あなたは私たちのためにそれをしたようです:)
Rajeev K Tomy

8

1つ明確な点があります。

同じものを呼び出し $observer->getEvent()->getSomething()$observer->getSomething()返します。

Mage_Core_Model_App::dispatchEventメソッドを見てください。

ある時点で、メソッドに渡される引数の$event = new Varien_Event($args);場所$argsがわかりますdispatchEvent
そして、インスタンスから要素に魔法のようにアクセスできるようにVarien_Event拡張します。 Varien_Object$argsVarien_Event

だけでなく、この行が存在し、上記と同じものです。 $observer->addData($args);$args

Varien_Event_ObserverまたVarien_Object、これにより$args、Observerオブジェクトを介して魔法のように要素にアクセスできるようになります。

結論:

$_dataObserverクラスとEventクラスのメンバーには、同じようなものが含まれています。オブザーバーには、他にもいくつかのフィールドがあります。以下のようにeventevent_name

次の$argsような外観だとします。

array(
   'some_arg' => 'someArg',
   'other_arg' => 'otherArg',
)

イベントをディスパッチするとき$_data、Eventオブジェクトのは次のようになります。

array(
   'some_arg' => 'someArg',
   'other_arg' => 'otherArg',
   'name' => 'event name here'
)

また、Observerクラスでは次のようになります。

array(
   'some_arg' => 'someArg',
   'other_arg' => 'otherArg',
   'event_name' => 'event name here',
   'event' => instance of Varien_event,
   'callback' => ..., 
   'name' => 'observer name here'
)

しかし、なぜこの一貫性の欠如が存在するのかについては答えられません。
私は、コードが2人の異なる開発者によって書かれたと推測することができます。
価値がある場合は、常にを使用します$observer->getEvent()->getSomething()

[編集]

例1でgetEvent()メソッドが呼び出されるのはなぜですか?または、例2でgetEvent()が呼び出されないのはなぜですか?

一貫性の欠如

getEvent()メソッドの目的は何ですか?

Varien_Eventオブジェクトは、観察者に渡される引数オーバーラッパーオブジェクトでなければなりません

どこでgetEvent()を使用すべきか、どこで使用すべきではないのか?好きなように使ってください。常に同じ結果が得られます。


一貫性の欠如についての説明を手に入れた、私の答えを参照
デジタルPianismでラファエルを

私は常に$observer->getEvent()オブザーバーでデータを取得することを好みます。$observer直接データを取得できることはわかっています。しかし、私はいつもそうは思わないので、オブジェクトの注入はVarien_Eventイベントデータを保持するために非常に特殊です。したがって、私は常にイベントオブジェクトに依存しています。それが正しいアプローチだと思います。
Rajeev K Tomy

私の答えを参照してください@RajeevKTomy、実際に使用したのはポイントがありませんgetEvent()あなたはイベント名を必要とするか、またはMagentoの1.0互換性を持つようにしたい場合を除いて
デジタルPianismでラファエル

3

一貫性の欠如に関する説明。

ビナイとビタリー・コロトゥンがいつか彼に言ったことによると:

getEvent()レガシーです。戻るMagentoの1.0日間のイベントデータを直接観測者から引くことができませんでした。

したがって、取得する必要event_nameがなく、コードがMagento 1.0互換であることをあまり気にしない場合は、省略できますgetEvent()

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