Como obter eventos / observadores no magento 2


16

No Magento 1, posso obter uma lista de eventos / observadores depurando o dispatchEvent()método Mage.phpcomo abaixo.

/**
     * Dispatch event
     *
     * Calls all observer callbacks registered for this event
     * and multiple observers matching event name pattern
     *
     * @param string $name
     * @param array $data
     * @return Mage_Core_Model_App
     */
    public static function dispatchEvent($name, array $data = array())
    {
        Mage::log($name,null,'Events');
        Varien_Profiler::start('DISPATCH EVENT:'.$name);
        $result = self::app()->dispatchEvent($name, $data);
        Varien_Profiler::stop('DISPATCH EVENT:'.$name);
        return $result;
    }

No magento 2, onde posso obter uma lista de eventos / observadores?

Respostas:


14

Você pode fazer a mesma coisa que você fez no Magento 1.x no método \Magento\Framework\Event\Manager::dispatch().

mas é uma diferença. Você não tem acesso ao criador de logs.
Você precisará injetar uma instância do logger no construtor.

protected $logger;

public function __construct(
    InvokerInterface $invoker, 
    ConfigInterface $eventConfig,
    \Psr\Log\LoggerInterface $logger
)
{
    $this->_invoker = $invoker;
    $this->_eventConfig = $eventConfig;
    $this->logger = $logger;
}

Então você pode chamar no dispatchmétodo isto:

$this->logger->info($message);

Em vez de infovocê pode usar todos os métodos de\Psr\Log\LoggerInterface


Você está
arrasando

@ Marius é apenas um erro de digitação com a palavra-chave $ protected em vez de protected $ logger.
Haijerome #

4

Como se trata de "depuração rápida", você pode evitar várias edições fazendo isso.

public function dispatch($eventName, array $data = [])
{
    $logger = \Magento\Framework\App\ObjectManager::getInstance()->get(\Psr\Log\LoggerInterface::class);
    $logger->info($eventName);
    ...

Localização

/lib/internal/Magento/Framework/Event/Manager.php

A resposta do @Marius é a solução correta.


Use \Psr\Log\LoggerInterface::classpor favor. Sempre.
nevvermind

@nevvermind .. Eu tentei isso antes ... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically. Por favor, deixe-me saber se você descobrir uma maneira mais fácil.
Renon Stewart

Estou falando da palavra-chave :: class em vez da string literal FQCN.
nevvermind

3

No meu caso, posso obter a lista de todos os eventos fazendo as alterações abaixo, que são muito atalhos, como fazemos no arquivo mage.php do magento1:

Nota: Eu testei apenas na versão magento2.1.1, por isso não tenho certeza de nenhuma outra versão

\vendor\magento\framework\Event\Manager.php

public function dispatch

escreva o código abaixo para obter todo o evento no arquivo debug.log após

$eventName = mb_strtolower($eventName); 

perto da linha 56

\Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->debug($eventName);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.