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

Rya*_*yan 4 php magento

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

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

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

Ala*_*orm 11

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

例如,我有一个观察者设置controller_action_predispatch事件.如果我将以下内容放入我的观察者中(因为观察者可能会被调用两次,您可能不希望exit针对您的具体情况)

class Pulsestorm_Requestset_Model_Observer
{
    public function myMethod($observer)
    {
        mageDebugBacktrace();
        exit;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

[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
Run Code Online (Sandbox Code Playgroud)

这给了我简化的callstack直到我调用的那个点mageDebugBacktrace.这[#]只是一个列表排序,后跟一个:分隔的字符串.string(/magento/app/code/core/Mage/Core/Model/App.php)的左侧是PHP文件,string()的右侧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
Run Code Online (Sandbox Code Playgroud)

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

$result = self::app()->dispatchEvent($name, $data);
Run Code Online (Sandbox Code Playgroud)

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

[4] /magento/app/code/core/Mage/Core/Controller/Varien/Action.php:530
Run Code Online (Sandbox Code Playgroud)

530Action.php对我的系统是

Mage::dispatchEvent('controller_action_predispatch', array('controller_action' => $this));
Run Code Online (Sandbox Code Playgroud)

答对了! 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);
Run Code Online (Sandbox Code Playgroud)