繁体   English   中英

如何确定在Magento中发送事件的位置?

[英]How can I determine where an event was dispatched from in Magento?

我有一个扩展,使用catalog_product_after_save事件来创建产品的简单索引和自定义导出的属性。

似乎有些情况下,如果在没有所有产品数据的情况下调度此事件,那么当索引更新时,它就会丢失数据。 我已经检查了一些缺少所需的信息,所以我相信它不再是一个问题,但我想记录它何时发生以及它来自哪里。

那么,有什么方法可以本地确定从我可以在观察者中看到的事件的发送位置?

熟悉PHP的回溯函数( debug_backtracedebug_print_backtrace )或更好的Magento /大对象安全版本, mageDebugBacktrace

例如,我有一个controller_action_predispatch事件的观察者设置。 如果我将以下内容放入我的观察者中(因为观察者可能会被调用两次,您可能不想为特定情况exit

class Pulsestorm_Requestset_Model_Observer
{
    public function myMethod($observer)
    {
        mageDebugBacktrace();
        exit;
    }
}

然后加载页面,当我尝试加载系统中的任何页面时,我会得到以下输出(因为该事件几乎每个页面都会触发)

[1] /magento/app/code/core/Mage/Core/Model/App.php:1343
[2] /magento/app/code/core/Mage/Core/Model/App.php:1322
[3] /magento/app/Mage.php:455
[4] /magento/app/code/core/Mage/Core/Controller/Varien/Action.php:530
[5] /magento/app/code/core/Mage/Core/Controller/Front/Action.php:64
[6] /magento/app/code/core/Mage/Core/Controller/Varien/Action.php:408
[7] /magento/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:251
[8] /magento/app/code/core/Mage/Core/Controller/Varien/Front.php:176
[9] /magento/app/code/core/Mage/Core/Model/App.php:352
[10] /magento/app/Mage.php:691
[11] /magento/index.php:87

这给了我简化的callstack,直到我称之为mageDebugBacktrace [#]只是一个列表排序,后跟一个:分隔的字符串。 字符串的左侧( /magento/app/code/core/Mage/Core/Model/App.php )是PHP文件,字符串( 1343 )的右侧是发生方法调用的行号

前三个电话

[1] /magento/app/code/core/Mage/Core/Model/App.php:1343
[2] /magento/app/code/core/Mage/Core/Model/App.php:1322
[3] /magento/app/Mage.php:455

是调度事件本身的PHP代码。 例如,我系统上的Mage.php第455行

$result = self::app()->dispatchEvent($name, $data);

它(通常取决于Magento版本/你的核心状态)堆栈中的第四个调用将指向调度事件的位置。

[4] /magento/app/code/core/Mage/Core/Controller/Varien/Action.php:530

我的系统上的Action.php530行是

Mage::dispatchEvent('controller_action_predispatch', array('controller_action' => $this));

答对了! Mage::dispatchEvent是调度事件的代码,因此我们找到了调度点。

如上所述,您的观察者可能被多次调用 - 因此使用输出缓冲记录数据可能比上面使用的输出/退出更好

    ob_start();
    mageDebugBacktrace();
    $contents = ob_get_clean();
    Mage::Log($contents);

    #If `Mage::log` is failing early in the bootstrap process
    #file_put_contents('/tmp/trace.log', $contents . "\n",FILE_APPEND);

这是mageDebugBacktrace函数定义:

function mageDebugBacktrace($ return = false,$ html = true,$ showFirst = false)

所以在调查之后,Alan的例子可以简化为这样的事情:

$trace = mageDebugBacktrace(true, false);
Mage::log($trace, null, 'log-name', true);

我知道的最简单的方法是做日志。 在app / Mage.php中找到这个功能

public static function dispatchEvent($name, array $data = array())
{

然后添加这些行

Mage::log($name, null, 'event_check.log', true);

比功能看起来像。

public static function dispatchEvent($name, array $data = array())
{
    Mage::log($name, null, 'event_check.log', true);
    Varien_Profiler::start('DISPATCH EVENT:'.$name);
    $result = self::app()->dispatchEvent($name, $data);
    #$result = self::registry('events')->dispatch($name, $data);
    Varien_Profiler::stop('DISPATCH EVENT:'.$name);
    return $result;
}

通过这样做,您可以跟踪每个事件的发送轨迹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM