Magento 1:为什么有些观察者方法调用getEvent()而有些却不呢?


8

我最近发现了一些东西,对此感到很好奇。

例1:使用 getEvent()

Mage_Core_Model_LocalesetLocale()方法中,分派事件:

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()在哪里?

Answers:


7

它可能有历史原因,可以回溯到1.0版本之后。

Varien_Event目的是包含用于具体事件参数的合理位置,但由于Magento的传递一个Varien_Observer目的是所有观察者方法,快捷的访问参数进行感测(它已经有至少自1.1)。

实际上,在今天使用的两个不同对象中我看不到任何值。

但是显然从一开始就没有这样的计划。在方法中Mage::addObserver(),不仅设置了事件和观察者名称以及来自<args>XML节点的静态参数,还设置了回调:

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

这样,观察者可以使用进行调度$observer->dispatch($event)。在这种情况下,观察者自己将没有事件数据,您将需要使用它们getEvent()来访问它。但是该方法没有在任何地方使用,因此在实践中并不重要。

如果您想实践某种软件考古学并进行更多研究,您会发现更多死代码,这些代码暗含着从未使之成为最终产品的原始想法,例如Varien_Event_Observer_Collection


谢谢。将要提到“历史”方面。似乎您为我们做了这
件事

8

一件事很清楚。

调用 $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',
)

调度事件时,$_dataEvent对象中的看起来像这样:

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()呢?随便使用它们。您将始终获得相同的结果。


得到了有关缺乏一致性的解释,请参阅我的答案
Raphael在Digital Pianism上2016年

我总是$observer->getEvent()想在观察者中获取任何数据。我知道我们可以$observer直接从中获取数据。但是我不这样做,因为我总是觉得,对象的注入Varien_Event非常特定于保存事件数据。因此,我始终依赖于事件对象。我认为这是正确的方法。
Rajeev K Tomy

@RajeevKTomy看到我的回答,实际上没有任何用处,getEvent()除非您需要事件名称或想兼容Magento 1.0
Digital Pianism的Raphael在

3

有关缺乏一致性的说明。

根据Vinai以及Vitaly Korotun告诉他的话:

getEvent()是遗产。回到Magento 1.0,无法直接从观察者中提取事件数据。

因此,如果您不需要获取代码event_name,也不必太在乎您的代码与Magento 1.0兼容,则可以省去getEvent()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.