Создание исключений из модели / представления / контроллера в приложении Zend Framework - PullRequest
4 голосов
/ 05 октября 2010

В библиотеке Zend Framework текущая практика (около 1.10.8) заключается в том, что компоненты библиотеки генерируют исключения, расширяющие Zend_Exception.

Например, компонент Zend_Layout выдает Zend_Layout_Exception

В моей собственной библиотеке ZF, где я добавляю свои собственные компоненты ZF или расширяю существующие компоненты, я выбрасываю Mylibrary_Exception (конечно, это не так называется):

Я вижучто они собираются изменить это в ZF 2.0

http://framework.zend.com/wiki/display/ZFDEV2/Proposal+for+Exceptions+in+ZF2

Мой актуальный вопрос таков:

Во всем приложении MVC в моих контроллерах / моделях /Представления, если мне нужно выбросить исключение (и это будет редко, потому что, очевидно, я буду обрабатывать ожидаемые ошибки по-другому) - НО, если мне нужно сгенерировать исключение здесь, какова лучшая практика в ZF?

следует ли мне просто

throw new Exception("this is an exception");

или создавать классы исключений в моих модулях ZF, аналогично тому, как организована библиотека ZF.то есть у них есть классы исключений для каждого компонента библиотеки. Должны ли я иметь классы исключений для каждого модуля приложения?

application / modules / user / controllers / UserController.php

application / modules /user / forms / UserForm.php

приложение / модули / пользователь / модели / User.php

приложение / модули / пользователь / views / scripts / index.phtml

приложение/modules/user/exceptions/Exception.php (класс User_Exception)

application / modules / user / exceptions / SuperexampleException.php (класс User_Exception_Superexample)

Я никогда никого не виделделайте что-то подобное раньше в ZF, поэтому я не уверен, хорошая ли это идея или нет.

ОБНОВЛЕНИЕ :

Чтобы прояснить мой вопрос далее - при поднятииисключения в MVC-части приложения (в отличие от библиотеки) - существуют ли какие-либо соглашения относительно использования определенных классов исключений (как это делает библиотека) по сравнению с использованием общего класса Exception?

Ответы [ 2 ]

4 голосов
/ 06 октября 2010

Я бы предложил иметь несколько «общих» исключений, таких как (InvalidParameter, InvalidRange). Хорошей отправной точкой является чешский фреймворк под названием Nette .

Затем добавьте некоторые исключения для приложений / пользователей / действий - например,

  • InvalidUserInputException - для состояний, где пользователь ввел недопустимое значение (например, «-1» как количество в eshop)
  • NotFoundException - для состояний, где что-то не было найдено
  • и т.д.

Добавьте к этим исключениям специальные переменные-члены, такие как id или data , и используйте их для использования исключений в качестве доставки сообщений об ошибках.

$e = new NotFoundException('There is no user %s in here!');
$e->setUser('Frank');
throw $e;
// later in error controller
if ($e instanceof NotFoundException) {
    // set header to 404, display error message, etc
}

Хорошо, что вы можете расширять исключения, как хотите, и перехватывать их в контроллере ошибок, как хотите (даже лучше, если используются интерфейсы).

class AccessDeniedExceptionimplements ILogableException
//...
throw new AccessDeniedException();
//in EC
if ($e instanceof ILoggableException) {
    $this->getLogger()->log($e->getLogMessage());
}
0 голосов
/ 05 октября 2010

Исключения выбрасывания в ZF V1 обрабатываются контроллером ошибок по умолчанию

  $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            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);
                $this->view->message = 'Application error';
                break;
        }

и если вам нужно перехватить пользовательские исключения, вам нужно добавить их в контроллер ошибок это простой и удобный способ, мне это нравится, и я очень доволен этим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...