0

PHPエラー、キャッチされない例外、およびユーザーがデータベーステーブルに記録したいその他のものを記録するための監視ソリューションを構築しています。商用の Zend Server の監視ソリューションに代わるものです。

Zend_Log を拡張し、前述のすべてのケースを処理できる Monitor クラスを作成しました。私の目的は、構成を 1 つの場所 (ブートストラップ) に減らすことです。現時点では、次のようにモニターを初期化しています。

protected function _initMonitor()
{
    $config = Zend_Registry::get('config');
    $monitorDb = Zend_Db::factory($config->resources->db->adapter, $config->resources->db->params);

    $monitor = new Survey_Monitor(new Zend_Log_Writer_Db($monitorDb, 'logEntries'), $config->projectName);

    $monitor->registerErrorHandler()->logExceptions();
}

registerErrorHandler() メソッドは、DB への PHP エラー ロギングを有効にします。logExceptions() メソッドは拡張機能であり、保護されたフラグを設定するだけです。

ErrorController errorAction に、次の行を追加します。

//use the monitor to log exceptions, if enabled
$monitor = Zend_Registry::get('monitor');

if (TRUE == $monitor->loggingExceptions)
{
    $monitor->log($errors->exception);
}

ただし、ErrorController にコードを追加することは避けたいと思いますが、プラグインを動的に登録したいと思います。これにより、ユーザーにとって既存のプロジェクトへの統合が容易になります。

質問: postDispatch フックを使用するコントローラー プラグインを登録して、同じ効果を得ることはできますか? errorAction をトリガーするイベントがわかりません。回路の複数の段階で複数のイベントがある場合、いくつかのフックを使用する必要がありますか?

4

2 に答える 2

1

プラグインをスタック インデックス 101 に登録します。routeShutdown および postDispatch の応答オブジェクトで例外を確認します。

$response = $this->getResponse();
if ($response->isException()) {
   $exceptions = $response->getException();
}

エラー ハンドラ ループ内で例外がスローされたかどうかを確認するには、try-catch ブロックに dispatch() を配置する必要があります

于 2011-03-20T00:25:32.420 に答える
0

Xerkusによって受け入れられた答えは、私を正しい軌道に乗せました。ただし、私のソリューションについてもう少し情報を追加したいと思います。

私は次のようなコントローラープラグインを作成しました。

class Survey_Controller_Plugin_MonitorExceptions extends Zend_Controller_Plugin_Abstract
{    
    public function postDispatch(Zend_Controller_Request_Abstract $request)
    {
        $response = $this->getResponse();
        $monitor = Zend_Registry::get('monitor');

        if ($response->isException())
        {
            $monitor->log($response);
        }
    }
}

$ response-> getException()を使用すると、Zend_Exceptionインスタンスの配列が取得されることに注意してください。それを理解した後、各例外を個別にログに書き込むロガーメソッドにforeachループを追加しただけです。

これで、ほとんどすべてが期待どおりに機能します。現時点では、まだ2つの同一の例外がログに記録されていますが、これは私が期待するものではありません。SOに関する別の質問でそれを調べる必要があります。

于 2011-03-20T15:07:43.257 に答える