Algo que notei recentemente e estou curioso sobre isso.
Exemplo 1: o uso de getEvent()
Em Mage_Core_Model_Locale
no setLocale()
método, um evento é enviado:
Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));
Um observador para este evento é bindLocale()
deMage_Adminhtml_Model_Observer
public function bindLocale($observer)
{
if ($locale=$observer->getEvent()->getLocale()) {
if ($choosedLocale = Mage::getSingleton('adminhtml/session')->getLocale()) {
$locale->setLocaleCode($choosedLocale);
}
}
return $this;
}
Então, como você pode ver, para recuperar o código do idioma, primeiro chamamos getEvent()
o observador.
Exemplo 2: sem getEvent()
Em Mage_Wishlist_Block_Customer_Wishlist_Item_Options
no __construct()
método, um evento é enviado:
Mage::dispatchEvent('product_option_renderer_init', array('block' => $this));
Portanto, concordamos que a mesma sintaxe é usada nos exemplos 1 e 2.
No entanto, um observador para este segundo exemplo é initOptionRenderer()
deMage_Bundle_Model_Observer
public function initOptionRenderer(Varien_Event_Observer $observer)
{
$block = $observer->getBlock();
$block->addOptionsRenderCfg('bundle', 'bundle/catalog_product_configuration');
return $this;
}
E como você pode ver, para recuperar o bloco, não chamamos getEvent()
o observador
Questão
- Por que o
getEvent()
método é chamado no exemplo # 1? Ou por quegetEvent()
não é chamado no exemplo # 2? - Qual é o objetivo do
getEvent()
método? - Onde se deve usar
getEvent()
e onde não se deve usá-lo?
fonte
Uma coisa está clara.
Ligando
$observer->getEvent()->getSomething()
e$observer->getSomething()
retornando a mesma coisa.Dê uma olhada no
Mage_Core_Model_App::dispatchEvent
método.Em um ponto, você tem
$event = new Varien_Event($args);
onde$args
estão os argumentos passados para odispatchEvent
método.E
Varien_Event
se estendeVarien_Object
para que você possa acessar magicamente os elementos$args
daVarien_Event
instância.mas também há essa linha
$observer->addData($args);
onde$args
estão as mesmas coisas acima.Varien_Event_Observer
também se estendeVarien_Object
para que você possa acessar magicamente elementos$args
através do objeto Observer.Conclusão:
O
$_data
membro da classe Observer e Event contém as mesmas coisas. O observador possui, além disso, alguns outros campos. comoevent
,event_name
.Vamos dizer o
$args
seguinte:Ao despachar o evento, o
$_data
objeto Event ficaria assim:e na classe Observer ficaria assim:
Mas não posso responder por que essa falta de consistência existe.
Só posso especular que o código foi escrito por 2 desenvolvedores diferentes.
Se vale alguma coisa, eu sempre uso
$observer->getEvent()->getSomething()
.[EDITAR]
Falta de consistência
O
Varien_Event
objeto deve ser um objeto de wrapper sobre os argumentos passados para o observadorfonte
$observer->getEvent()
de pegar qualquer dado no observador. Eu sei que podemos pegar dados$observer
diretamente. Mas não faço isso porque sempre sinto que a injeção de objetoVarien_Event
é muito específica para armazenar dados de eventos. Portanto, eu sempre dependo do objeto de evento. Eu sinto que essa é a abordagem correta.getEvent()
, exceto se precisar o nome do evento ou quer ser Magento 1.0 compatívelExplicação sobre falta de consistência.
Segundo Vinai e o que Vitaly Korotun disse a ele em algum momento:
Portanto, se você não precisa obter
event_name
e não se importa muito com o fato de seu código ser compatível com Magento 1.0, você pode deixar de foragetEvent()
.fonte