Подключение к циклу обработки ошибок - PullRequest
0 голосов
/ 20 марта 2011

Я создаю решение для мониторинга ошибок в PHP, необработанных исключений и всего, что пользователь хочет записать в таблицу базы данных.Вид замены решения для мониторинга в коммерческом Zend Server.

Я написал класс Monitor, который расширяет Zend_Log и может обрабатывать все упомянутые случаи.Моя цель - свести конфигурацию к одному месту, которое будет Bootstrap.В данный момент я инициализирую монитор следующим образом:

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 () включает запись ошибок php в БД, метод logExceptions () является расширением и просто устанавливает защищенный флаг.

В сообщении об ошибке ErrorController я добавляю следующие строки:

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

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

Хотя я бы хотел избежать добавления кода в ErrorController, я бы предпочел динамически зарегистрировать плагин.Это упростит интеграцию в существующие проекты для пользователя.

Вопрос: Могу ли я зарегистрировать плагин контроллера, использующий хук postDispatch, и добиться того же эффекта?Я не понимаю, какие события вызывают действие errorAction. Если на нескольких этапах схемы происходит несколько событий, нужно ли использовать несколько перехватчиков?

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Зарегистрируйте ваш плагин с индексом стека 101. Проверьте наличие исключений в объекте ответа на routeShutdown и postDispatch.

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

, чтобы проверить, было ли выброшено исключение в цикле обработчика ошибок, вы должны поместить dispatch () в попыткублок

0 голосов
/ 20 марта 2011

Принятый ответ 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);
        }
    }
}

Обратите внимание, что вы получаете массив экземпляров Zend_Exception, если используете $ response-> getException (). Поняв это, я просто добавил цикл foreach в метод ведения журнала, который записывает каждое исключение в журнал отдельно.

Теперь почти все работает как положено. На данный момент я все еще регистрирую два идентичных исключения, чего я не ожидал. Я должен разобраться в этом через другой вопрос о SO.

...