Cómo conseguir eventos / observadores en magento 2


16

En Magento 1 puedo obtener una lista de eventos / observadores mediante el dispatchEvent()método de depuración de la Mage.phpsiguiente manera.

/**
     * 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;
    }

¿En magento 2 donde puedo obtener una lista de eventos / observadores?

Respuestas:


14

Puede hacer lo mismo que hizo en Magento 1.x en el método \Magento\Framework\Event\Manager::dispatch().

Pero es una diferencia. No tienes acceso al registrador.
Tendrá que inyectar una instancia del registrador en el constructor.

protected $logger;

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

Entonces puede llamar al dispatchmétodo esto:

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

En lugar de infousted, puede usar todos los métodos de\Psr\Log\LoggerInterface


Estás rockeando ........
Bojjaiah

@Marius es solo un error tipográfico con la palabra clave $ protected en lugar de protegido $ logger.
Haijerome

4

Dado que esto es para una "depuración rápida", puede evitar varias ediciones al hacerlo.

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

Ubicación

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

La respuesta de @Marius es la solución correcta.


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

@nevvermind .. He intentado eso antes ... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically. Por favor, avíseme si encuentra una manera más fácil.
Renon Stewart

Estoy hablando de la palabra clave :: class en lugar de la cadena literal FQCN.
nevvermind

3

En mi caso, puedo obtener una lista de todos los eventos haciendo los cambios a continuación, que es un atajo muy corto como lo hacemos en el archivo mage.php de magento1:

Nota: solo he probado en la versión magento2.1.1, así que no estoy seguro de ninguna otra versión

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

public function dispatch

escriba el código a continuación para obtener todos los eventos en el archivo debug.log después

$eventName = mb_strtolower($eventName); 

cerca de la línea 56

\Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->debug($eventName);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.