Что-то, что я недавно заметил, и мне любопытно.
Пример 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()
и где не следует его использовать?
источник
Ясно одно.
Звоню
$observer->getEvent()->getSomething()
и$observer->getSomething()
возвращаю тоже самое.Посмотрите на
Mage_Core_Model_App::dispatchEvent
метод.В какой-то момент у вас есть,
$event = new Varien_Event($args);
где$args
аргументы передаются вdispatchEvent
метод.И
Varien_Event
расширяется,Varien_Object
чтобы вы могли волшебным образом получить доступ к элементам$args
изVarien_Event
экземпляра.но есть и эта линия,
$observer->addData($args);
где$args
те же вещи, что и выше.Varien_Event_Observer
также расширяется,Varien_Object
так что это позволяет вам магическим образом получить доступ к элементам$args
через объект Observer.Вывод:
$_data
Член в классе Observer и класса Event содержат вид тех же вещей. У наблюдателя есть еще несколько других полей. какevent
,event_name
.Допустим,
$args
выглядит так:При отправке
$_data
события объект в событии будет выглядеть так:и в классе Observer будет выглядеть так:
Но я не могу ответить, почему существует такая непоследовательность.
Я могу только предположить, что код был написан двумя разными разработчиками.
Если оно чего-то стоит, я всегда пользуюсь
$observer->getEvent()->getSomething()
.[РЕДАКТИРОВАТЬ]
Недостаток согласованности
Varien_Event
Объект должен быть объектом обертки над аргументами , переданных к наблюдателюисточник
$observer->getEvent()
захватывать любые данные в обозревателе. Я знаю, что мы можем получить данные$observer
напрямую. Но я не делаю этого, потому что я всегда чувствую, что внедрение объектаVarien_Event
очень специфично для хранения данных события. Следовательно, я всегда зависим от объекта события. Я чувствую, что это правильный подход.getEvent()
за исключением случаев, когда тебе нужно имя события ИЛИ хочешь быть совместимым с Magento 1.0Объяснение относительно отсутствия согласованности.
По словам Винай и что Виталий Коротун сказал ему в какой-то момент:
Поэтому, если вам не нужно получать
event_name
и не слишком беспокоиться о совместимости вашего кода с Magento 1.0, вы можете обойтись без негоgetEvent()
.источник