Як отримати події / спостерігачів у 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, а не захищеним $ 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.