Cara mendapatkan acara / pengamat di Magento 2

16

Di Magento 1 saya bisa mendapatkan daftar acara / pengamat dengan dispatchEvent()metode debug dari Mage.phpseperti di bawah ini.

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

Di magento 2, di mana saya bisa mendapatkan daftar acara / pengamat?

Bojjaiah
sumber

Jawaban:

14

Anda dapat melakukan hal yang sama dengan yang Anda lakukan di Magento 1.x dalam metode ini \Magento\Framework\Event\Manager::dispatch().

tapi itu perbedaan. Anda tidak memiliki akses ke logger.
Anda harus menyuntikkan instance logger di konstruktor.

protected $logger;

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

Kemudian Anda dapat memanggil dispatchmetode ini:

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

Alih-alih infoAnda dapat menggunakan semua metode dari\Psr\Log\LoggerInterface

Marius
sumber
Anda goyang ........
Bojjaiah
@Marius hanya salah ketik dengan kata kunci $ protected, bukan $ logger terlindungi.
Haijerome
4

Karena ini untuk "debug cepat", Anda dapat menghindari beberapa pengeditan dengan melakukan.

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

Lokasi

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

@Marius menjawab adalah solusi yang tepat.

Renon Stewart
sumber
\Psr\Log\LoggerInterface::classSilakan gunakan . Selalu.
nevvermind
@nevvermind .. Aku mencoba bahwa sebelum ... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically. Tolong beri tahu saya jika Anda mencari cara yang lebih mudah.
Renon Stewart
Saya sedang berbicara tentang kata kunci :: kelas alih-alih string FQCN literal .
nevvermind
3

Dalam kasus saya, saya bisa mendapatkan daftar semua acara dengan melakukan perubahan di bawah ini yang sangat pendek seperti yang kita lakukan di file mage.php dari magento1:

Catatan: Saya hanya menguji versi magento2.1.1 jadi saya tidak yakin untuk versi lain

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

public function dispatch

tulis kode di bawah ini untuk mendapatkan semua acara di file debug.log setelah

$eventName = mb_strtolower($eventName); 

dekat dengan garis 56

\Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->debug($eventName);
jyotiranjan.in
sumber