Как и многие другие, я пытаюсь создать свой собственный MVC, чтобы улучшить свои знания и т. Д. :)
Я хотел бы спросить об обработке ошибок / исключений в шаблоне MVC.
Dispatcher
получает информацию от Router
о Route
и получает Controller
и имя метода от Route
. Затем диспетчер пытается создать экземпляр этого Controller
и выполнить этот метод.
Теперь давайте представим, что наш метод вызывает исключение (да, он не перехватывается в методе из-за плохого кода :)). Это может быть пользовательское исключение, например NotFoundException
или ApplicationInternalErrorException
, или одно из исключений SPL, например RuntimeErrorException
или InvalidArgumentException
. На самом деле это не имеет значения.
Конечно, мы хотим Dispatcher
перехватить это исключение, зарегистрировать его и ответить соответственно типом исключения: отобразить страницу 404, если NotFoundException
была перехвачена и т. Д.
Какая лучшая практика для этого? Dispatcher
правильное место для этого? Возможно, лучшее место - FrontController
(но я не использую этот шаблон; Dispatcher
создает Controller
экземпляр.
Простой код:
class Dispatcher {
public function dispatch() {
$controller = $this->getRouter()->getController();
$method = $this->getRouter()->getMethod();
$args = $this->getRouter()->getArguments();
try {
call_user_func_array(array($controller, $method), array_values($args));
} catch (Exception $e) {
Logger::log($e->__toString);
if ($e instanceof NotFoundPage) {
call_user_func(array('ErrorController', 'notFound'))
} elseif ($e instanceof ...) {
...
} elseif ($e instanceof ...) {
...
} else {
...
}
}
}
}
Это нормально или это не очень хорошая практика?
Спасибо.