Как получить события / наблюдателей в 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, где я могу получить список событий / наблюдателей?

Bojjaiah
источник

Ответы:

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 вместо 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
@nevvermind .. Я пытался что раньше ... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically. Пожалуйста, дайте мне знать, если вы найдете более простой способ.
Ренон Стюарт
Я говорю о ключевом слове :: class вместо буквенной строки FQCN.
nevvermind
3

В моем случае я могу получить список всех событий, выполнив следующие изменения, которые очень короткие, как мы делаем в файле mage.php magento1:

Примечание: я тестировал только на версии 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);
jyotiranjan.in
источник