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

时间:2013-04-03 19:05:12

标签: php magento

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

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

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

3 个答案:

答案 0 :(得分:11)

熟悉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
我系统上530

Action.php

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);

答案 1 :(得分:3)

这是mageDebugBacktrace函数定义:

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

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

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

答案 2 :(得分:1)

我知道最简单的方法就是做日志。 在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;
}

通过这样做,您可以跟踪每个被调度的事件。