Cách nhận sự kiện / quan sát viên trong magento 2


16

Trong Magento 1 tôi có thể lấy danh sách các sự kiện / quan sát bằng dispatchEvent()phương pháp gỡ lỗi từ Mage.phpnhư bên dưới.

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

Trong magento 2, nơi tôi có thể nhận danh sách các sự kiện / quan sát viên?

Câu trả lời:


14

Bạn có thể làm điều tương tự như bạn đã làm trong Magento 1.x trong phương thức \Magento\Framework\Event\Manager::dispatch().

nhưng đó là một sự khác biệt. Bạn không có quyền truy cập vào logger.
Bạn sẽ phải thêm một thể hiện của logger trong hàm tạo.

protected $logger;

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

Sau đó, bạn có thể gọi theo dispatchphương thức này:

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

Thay vì infobạn có thể sử dụng tất cả các phương pháp từ\Psr\Log\LoggerInterface


Bạn đang rung chuyển ........
Bojjaiah

@Marius chỉ là một lỗi đánh máy với từ khóa $ được bảo vệ thay vì $ logger được bảo vệ.
Haijerome

4

Vì đây là để "gỡ lỗi nhanh", bạn có thể tránh được nhiều chỉnh sửa bằng cách thực hiện.

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

Vị trí

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

@Marius trả lời là giải pháp đúng.


Sử dụng \Psr\Log\LoggerInterface::classxin vui lòng. Luôn luôn.
nevvermind

@nevvermind .. Tôi cố gắng mà trước ... Fatal error: Non-static method Psr\Log\LoggerInterface::info() cannot be called statically. Xin vui lòng cho tôi biết nếu bạn tìm ra một cách dễ dàng hơn.
Renon Stewart

Tôi đang nói về từ khóa :: thay vì chuỗi FQCN theo nghĩa đen .
nevvermind

3

Trong trường hợp của tôi, tôi có thể nhận được danh sách tất cả các sự kiện bằng cách thực hiện các thay đổi dưới đây rất ngắn gọn như chúng tôi làm trong tệp mage.php của magento1:

Lưu ý: Tôi mới chỉ thử nghiệm trên phiên bản magento2.1.1 nên tôi không chắc chắn cho bất kỳ phiên bản nào khác

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

public function dispatch

viết mã dưới đây để có được tất cả các sự kiện trong tệp debug.log sau

$eventName = mb_strtolower($eventName); 

gần đường 56

\Magento\Framework\App\ObjectManager::getInstance()->get('Psr\Log\LoggerInterface')->debug($eventName);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.