Come ottenere eventi / osservatori in magento 2


16

In Magento 1 posso ottenere un elenco di eventi / osservatori con il dispatchEvent()metodo di debug Mage.phpcome di seguito.

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

In magento 2 dove posso ottenere un elenco di eventi / osservatori?

Risposte:


14

Puoi fare la stessa cosa che hai fatto in Magento 1.x nel metodo \Magento\Framework\Event\Manager::dispatch() .

ma è una differenza. Non hai accesso al logger.
Dovrai iniettare un'istanza del logger nel costruttore.

protected $logger;

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

Quindi puoi chiamare nel dispatchmetodo questo:

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

Invece di infote puoi usare tutti i metodi di\Psr\Log\LoggerInterface


Stai dondolando ........
Bojjaiah,

@Marius solo un errore di battitura con parola chiave $ protetta invece di $ logger protetto.
Haijerome,

4

Poiché si tratta di "debug rapido", è possibile evitare più modifiche eseguendo.

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

Posizione

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

La risposta di @Marius è la soluzione corretta.


Usa per \Psr\Log\LoggerInterface::classfavore. Sempre.
nevvermind

@nevvermind .. Ho provato prima ... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically. Per favore fatemi sapere se trovate un modo più semplice.
Renon Stewart,

Sto parlando della parola chiave :: class anziché della stringa letterale FQCN.
nevvermind

3

Nel mio caso posso ottenere l'elenco di tutti gli eventi facendo le seguenti modifiche che sono molto brevi come facciamo nel file mage.php di magento1:

Nota: ho testato solo sulla versione magento2.1.1, quindi non sono sicuro per qualsiasi altra versione

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

public function dispatch

scrivere sotto il codice per ottenere tutti gli eventi nel file debug.log dopo

$eventName = mb_strtolower($eventName); 

vicino alla linea 56

\Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->debug($eventName);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.