如何在magento 2中获取事件/观察者


16

在Magento 1中,我可以通过如下所示的调试dispatchEvent()方法获取事件/观察者列表Mage.php

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

在magento 2中,我可以获取事件/观察者列表吗?

Answers:


14

您可以使用方法在Magento 1.x中执行相同的操作\Magento\Framework\Event\Manager::dispatch()

但这是有区别的。您无权访问记录器。
您将必须在构造函数中注入记录器的实例。

protected $logger;

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

然后可以调用以下dispatch方法:

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

而是info可以使用以下所有方法\Psr\Log\LoggerInterface


您正在摇摆……
..

@Marius只是一个带有关键字$ protected的错字,而不是受保护的$ logger。
Haijerome

4

由于这是为了“快速调试”,因此可以避免多次编辑。

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

位置

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

@Marius答案是正确的解决方案。


请使用\Psr\Log\LoggerInterface::class。总是。
nevvermind 2015年

@nevvermind ..我试过,前... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically。如果您想出一种简单的方法,请告诉我。
雷诺·斯图尔特

我说的是:: class关键字,而不是文字字符串 FQCN。
nevvermind 2015年

3

就我而言,我可以通过以下更改来获取所有事件的列表,这些更改非常快捷,就像在magento1的mage.php文件中所做的那样:

注意:我仅在magento2.1.1版本上进行过测试,因此不确定是否有其他版本

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

public function dispatch

写下面的代码以获取所有事件在debug.log文件之后

$eventName = mb_strtolower($eventName); 

靠近56号线

\Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->debug($eventName);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.