4

catalog_product_after_saveイベントを使用して、製品の単純なインデックスとカスタム エクスポートの属性を作成する拡張機能があります。

このイベントがすべての製品データなしでディスパッチされる場合があるようです。そのため、インデックスが更新されると、データが欠落します。欠落している必要な情報のいくつかを探すチェックを入れたので、それはもはや問題ではないと信じていますが、いつ発生し、どこから来たのかを記録したいと思います.

それで、オブザーバーで見ることができるイベントがどこからディスパッチされたかをネイティブに判断する方法はありますか?

4

3 に答える 3

11

PHP のバックトレース関数 (debug_backtraceおよびdebug_print_backtrace) に慣れるか、Magento/ラージ オブジェクト セーフ バージョンのmageDebugBacktrace.

たとえば、controller_action_predispatchイベントのオブザーバーをセットアップしています。オブザーバーに次のものを入れると(オブザーバーは2回呼び出される可能性がある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

これにより、呼び出した時点までの簡略化されたコールスタックが得られますmageDebugBacktrace。は、区切ら[#]れた文字列が続く単なるリストの順序です。:文字列の左側 ( /magento/app/code/core/Mage/Core/Model/App.php) は PHP ファイル、文字列の右側 ( 1343) はメソッド呼び出しが発生した行番号です。

最初の 3 つの呼び出し

[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 番目の呼び出しです。

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

私のシステムの行530Action.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);
于 2013-04-03T19:26:32.020 に答える
3

以下は mageDebugBacktrace 関数の定義です。

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

したがって、調べた後、アランの例は次のように単純化できます。

$trace = mageDebugBacktrace(true, false);
Mage::log($trace, null, 'log-name', true);
于 2013-04-04T21:30:44.573 に答える
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;
}

そうすることで、ディスパッチされるすべてのイベントを追跡できます。

于 2013-05-19T06:06:18.173 に答える