Comment obtenir des événements / observateurs dans Magento 2

16

Dans Magento 1, je peux obtenir la liste des événements / observateurs en déboguant la dispatchEvent()méthode Mage.phpcomme ci-dessous.

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

Dans magento 2, où puis-je obtenir la liste des événements / observateurs?

Bojjaiah
la source

Réponses:

14

Vous pouvez faire la même chose que vous avez fait dans Magento 1.x dans la méthode \Magento\Framework\Event\Manager::dispatch().

mais c'est une différence. Vous n'avez pas accès à l'enregistreur.
Vous devrez injecter une instance de l'enregistreur dans le constructeur.

protected $logger;

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

Ensuite, vous pouvez appeler la dispatchméthode suivante:

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

Au lieu de cela, infovous pouvez utiliser toutes les méthodes de\Psr\Log\LoggerInterface

Marius
la source
Vous vous
balancez
@Marius juste une faute de frappe avec le mot clé $ protected au lieu de $ logger protégé.
Haijerome
4

Comme il s'agit d'un "débogage rapide", vous pouvez éviter plusieurs modifications en faisant.

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

Emplacement

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

La réponse @Marius est la bonne solution.

Renon Stewart
la source
\Psr\Log\LoggerInterface::classVeuillez utiliser . Toujours.
Nevvermind
@nevvermind .. J'ai essayé avant ... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically. Veuillez me faire savoir si vous trouvez un moyen plus simple.
Renon Stewart
Je parle du mot - clé :: class au lieu de la chaîne littérale FQCN.
Nevvermind
3

Dans mon cas, je peux obtenir la liste de tous les événements en effectuant les modifications ci-dessous, ce qui est très court comme nous le faisons dans le fichier mage.php de magento1:

Remarque: je n'ai testé que sur la version magento2.1.1 donc je ne suis sûr pour aucune autre version

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

public function dispatch

écrivez le code ci-dessous pour obtenir tous les événements dans le fichier debug.log après

$eventName = mb_strtolower($eventName); 

près de la ligne 56

\Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->debug($eventName);
jyotiranjan.in
la source