Обработка ошибок / исключений в MVC - PullRequest
2 голосов
/ 17 августа 2011

Как и многие другие, я пытаюсь создать свой собственный 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 {
               ...
            }
        }

    }
}

Это нормально или это не очень хорошая практика?

Спасибо.

1 Ответ

0 голосов
/ 19 августа 2011

Я просто использую внешний файл (xml, yaml или все что угодно), который содержит все маршруты для моего веб-приложения.Когда приходит запрос, Маршрутизатор пытается сопоставить URL запроса с одним из маршрутов, которые у меня есть в моем файле.Если совпадений не было, он просто перенаправляет на страницу 404 с заголовком 404.Я думаю, что вам не нужно блоки try / catch для этого.

Я взял идею у Symfony.

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