Jak zdobyć wydarzenia / obserwatorów w Magento 2

16

W Magento 1 mogę uzyskać listę zdarzeń / obserwatorów, debugując dispatchEvent()metodę z Mage.phpponiższej metody .

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

W Magento 2, gdzie mogę uzyskać listę wydarzeń / obserwatorów?

Bojjaiah
źródło

Odpowiedzi:

14

Można zrobić to samo zrobiłeś w Magento 1.x w metodzie \Magento\Framework\Event\Manager::dispatch().

ale to różnica. Nie masz dostępu do rejestratora.
Będziesz musiał wstrzyknąć wystąpienie programu rejestrującego do konstruktora.

protected $logger;

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

Następnie możesz wywołać dispatchmetodę:

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

Zamiast tego infomożesz użyć wszystkich metod z\Psr\Log\LoggerInterface

Marius
źródło
Kołyszesz
@Marius to tylko literówka ze słowem kluczowym $ chronione zamiast chronionego $ logger.
Haijerome
4

Ponieważ służy to do „szybkiego debugowania”, można uniknąć wielu edycji.

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

Lokalizacja

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

Odpowiedź @Marius jest poprawnym rozwiązaniem.

Renon Stewart
źródło
Użyj \Psr\Log\LoggerInterface::classproszę. Zawsze.
nevvermind,
@nevvermind .. Próbowałem tego wcześniej ... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically. Daj mi znać, jeśli wymyślisz łatwiejszy sposób.
Renon Stewart,
Mówię o słowie kluczowym :: class zamiast dosłownego ciągu FQCN.
nevvermind,
3

W moim przypadku mogę uzyskać listę wszystkich zdarzeń, wykonując poniższe zmiany, co jest bardzo skrótowe, tak jak robimy to w pliku mage.php magento1:

Uwaga: Testowałem tylko na wersji magento2.1.1, więc nie jestem pewien co do żadnej innej wersji

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

public function dispatch

napisz poniżej kodu, aby uzyskać wszystkie zdarzenia w pliku debug.log po

$eventName = mb_strtolower($eventName); 

przy linii 56

\Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->debug($eventName);
jyotiranjan.in
źródło