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

Ответы:


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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.