Приложение Zend Framework - отображение 404 страниц ошибок / страниц общих ошибок в рабочем режиме и отображение исключений в режиме разработки - PullRequest
2 голосов
/ 09 марта 2010

Моя цель - достичь следующего; в любой среде, Производство, Тестирование или Разработка, приложение может иметь 2 режима: Рабочий режим и Режим отладки.

В настоящее время он настроен так, что config.ini имеет этот параметр. Никаких проблем с этим.

Проблема возникает, когда я хочу добиться следующего: Если задан производственный режим, я хочу отображать только пользовательскую страницу ошибки: страницу с сообщением 404, если не удается найти контроллер или действие, или страницу с сообщением об общей ошибке, если произошел другой тип ошибки (возникла исключительная ситуация, ошибка подключения , так далее). Мне также нужно записать исключение, где это возможно, в журнал / текстовый файл. Если установлен режим отладки, все, что я хочу увидеть, это возникшее исключение.

Я пробовал разные методы, но, похоже, зашел в тупик. Я пытался использовать плагин ErrorHandler, но он просто показывает пустую страницу при возникновении исключения. Я пытался использовать пользовательский плагин только для обработки 404 ошибок, на самом деле не работает, потому что он конфликтует с моим плагином аутентификации. Пробовал без плагина аутентификации, но затем он вызывает проблемы из-за моего использования модулей (всего 1 для администратора).

После того, как я попробовал другие вещи и их комбинации, я не могу придумать, как этого добиться.

Я был бы очень признателен, если бы кто-нибудь смог пролить свет на то, как лучше всего добиться желаемого результата.

У меня также есть некоторые предположения, которые я хотел бы уточнить, если можно. Это:

$oFrontController->throwExceptions(false);

Должно быть установлено значение false, чтобы плагин ErrorHandler работал. Это правильно?

try {
$oFrontController->dispatch();
} catch (Exception $oException) {
...
}

У меня есть приведенный выше код для перехвата исключений и их регистрации, но, как упоминалось выше, похоже, не справляется с работой (хотя работает нормально, когда я не использую ErrorHandler, хотя, установив $ oFrontController > throwExceptions (истинный). )

Какой лучший способ справиться с аутентификацией? В настоящее время он настроен как плагин, который устанавливает «ресурс» на основе модуля / контроллера и проверяет класс ACL на предмет предоставления доступа или нет. Я видел несколько примеров, где часть ACL является отдельной на основе контроллера. Было бы более разумно иметь Аутентификацию как Модель, которая вызывается при инициализации контроллера и проверяет с помощью соответствующего набора разрешений, должно ли действие быть разрешено или нет? (Я спрашиваю об этом в основном из-за конфликта, который возник при попытке сделать страницы ошибок с Аутентификацией, чтобы увидеть, какие альтернативы доступны)

Спасибо за любую помощь, которую вы можете оказать мне по этому вопросу. Спасибо.

1 Ответ

4 голосов
/ 09 марта 2010

установите Модуль форматирования исключений и создайте контроллер ошибок

class ErrorController extends Zend_Controller_Action {
    public function errorAction() {
        $environment = Zend_Registry::getInstance()->configuration->environment;
        if( $environment == 'development' ) {
            // The ExpectionFormatter requires access to a couple of protected
            // items so the must be passed in explicitly. The 3rd param
            // controls whether or not the stack trace contains interactive source
            // code. When enabled browser performance is degradded. It will default
            // to false if the 3rd param is not provided
            ExceptionFormatter::display(
                $this->_getParam('error_handler'),
                $this->_helper,
                true
            );
        } else {
            $errors = $this->_getParam('error_handler');
            switch ($errors->type) {
                case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
                    case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                        // 404 error -- controller or action not found
                        $this->getResponse()->setHttpResponseCode(404);
                        $this->view->message = 'Page not found';
                        break;
                    default:
                        // application error
                        $this->getResponse()->setHttpResponseCode(500);
                        $e = $this->_getParam('error_handler');
                        $this->view->message = $e['exception']->getMessage();
                        break;
                    }
                    $this->view->environment = $environment;
                    $this->view->exception = $errors->exception;
                    $this->view->request = $errors->request;
        }
    }
}
...