Magento 1: por que algum método observador chama getEvent () e outros não?

8

Algo que notei recentemente e estou curioso sobre isso.

Exemplo 1: o uso de getEvent()

Em Mage_Core_Model_Localeno 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_Optionsno __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 que getEvent()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?
Raphael na Digital Pianism
fonte

Respostas:

7

Provavelmente tem razões históricas, voltando além da versão 1.0.

O Varien_Eventobjeto é o local lógico para conter parâmetros para um evento concreto, mas como o Magento passa um Varien_Observerobjeto para todos os métodos de observação, o acesso de atalho aos parâmetros fazia sentido (e existe pelo menos desde 1,1).

Na verdade, não vejo nenhum valor em dois objetos diferentes, como são usados ​​hoje .

Mas obviamente não foi planejado assim desde o início. No método Mage::addObserver(), não apenas os nomes de eventos e observadores e argumentos estáticos do <args>nó XML são definidos, mas também um retorno de chamada:

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

Dessa forma, os observadores são capazes de se despachar, com $observer->dispatch($event). Nesse caso, os observadores não teriam os dados do evento sozinhos e você precisaria usá-los getEvent()para acessá-los. Mas o método não é usado em nenhum lugar; portanto, na prática, não importa.

Se você quiser praticar alguma arqueologia de software e cavar mais, encontrará mais códigos mortos que sugerem idéias originais que nunca chegaram ao produto final, como o Varien_Event_Observer_Collection.

Fabian Schmengler
fonte
Obrigado. Iria mencionar aspectos "históricos". Parece que você fez isso para nós :)
Rajeev K Tomy
8

Uma coisa está clara.

Ligando $observer->getEvent()->getSomething()e $observer->getSomething()retornando a mesma coisa.

Dê uma olhada no Mage_Core_Model_App::dispatchEventmétodo.

Em um ponto, você tem $event = new Varien_Event($args);onde $argsestão os argumentos passados ​​para o dispatchEventmétodo.
E Varien_Eventse estende Varien_Objectpara que você possa acessar magicamente os elementos $argsda Varien_Eventinstância.

mas também há essa linha $observer->addData($args);onde $argsestão as mesmas coisas acima.

Varien_Event_Observertambém se estende Varien_Objectpara que você possa acessar magicamente elementos $argsatravés do objeto Observer.

Conclusão:

O $_datamembro da classe Observer e Event contém as mesmas coisas. O observador possui, além disso, alguns outros campos. como event, event_name.

Vamos dizer o $argsseguinte:

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

Ao despachar o evento, o $_dataobjeto Event ficaria assim:

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

e na classe Observer ficaria assim:

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

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]

Por que o método getEvent () é chamado no exemplo # 1? Ou por que getEvent () não é chamado no exemplo # 2?

Falta de consistência

Qual é o objetivo do método getEvent ()?

O Varien_Eventobjeto deve ser um objeto de wrapper sobre os argumentos passados ​​para o observador

Onde se deve usar getEvent () e onde não se deve usá-lo? Use-os como quiser. Você obterá o mesmo resultado o tempo todo.

Marius
fonte
Tem a explicação sobre falta de consistência, veja a minha resposta
Raphael em Digital pianismo
Eu sempre gosto $observer->getEvent()de pegar qualquer dado no observador. Eu sei que podemos pegar dados $observerdiretamente. Mas não faço isso porque sempre sinto que a injeção de objeto Varien_Eventé muito específica para armazenar dados de eventos. Portanto, eu sempre dependo do objeto de evento. Eu sinto que essa é a abordagem correta.
precisa saber é o seguinte
@RajeevKTomy ver a minha resposta, não há realmente nenhum ponto de usar getEvent(), exceto se precisar o nome do evento ou quer ser Magento 1.0 compatível
Raphael em Digital pianismo
3

Explicação sobre falta de consistência.

Segundo Vinai e o que Vitaly Korotun disse a ele em algum momento:

getEvent()é legado. De volta ao Magento 1.0 dias, os dados do evento não podiam ser extraídos diretamente do observador.

Portanto, se você não precisa obter event_namee não se importa muito com o fato de seu código ser compatível com Magento 1.0, você pode deixar de fora getEvent().

Raphael na Digital Pianism
fonte