Подключение к циклу обработки ошибок
Я создаю решение по мониторингу для регистрации ошибок 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 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. Если на нескольких этапах схемы происходит несколько событий, нужно ли мне использовать несколько хуков?
2 ответа
Принятый ответ 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.
Зарегистрируйте ваш плагин с индексом стека 101. Проверьте наличие исключений в объекте ответа на routeShutdown и postDispatch.
$response = $this->getResponse();
if ($response->isException()) {
$exceptions = $response->getException();
}
чтобы проверить, было ли выброшено исключение в цикле обработчика ошибок, вы должны поместить dispatch() в блок try-catch