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は、保護された$ loggerの代わりにキーワード$ protectedを使用した単なるタイプミスです。
ハイジェローム

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。もっと簡単な方法を見つけたら教えてください。
レノンスチュワート

私はリテラル文字列 FQCNの代わりに:: classキーワードについて話しています
-nevvermind

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.