วิธีรับกิจกรรม / ผู้สังเกตการณ์ใน 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;
    }

ในวีโอไอพี 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


คุณกำลังโยก ........
Bojjaiah

@Marius เพียงพิมพ์ด้วยคำสำคัญ $ ป้องกันแทน $ 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... โปรดแจ้งให้เราทราบหากคุณเข้าใจวิธีการที่ง่ายขึ้น
Renon Stewart

ฉันกำลังพูดถึงคำหลัก:: 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.