Присоединение к циклу обработки ошибок

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

Я написал класс 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 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, если на нескольких этапах схемы есть несколько событий, нужно ли мне использовать несколько перехватчиков?

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

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

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

    Принятый ответ 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 к моему методу logger, который записывает каждое исключение для записи отдельно.

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