和许多其他应用一样,我正在尝试创建自己的MVC来提高我的知识等。:)
我想问一下在MVC模式中处理错误/异常的问题。Dispatcher
从Router
获取有关Route
的信息,并从Controller
获取Route
和方法的名称。然后,调度程序尝试创建此Controller
的实例并执行此方法。
现在,让我们想象一下我们的方法抛出异常(是的,由于错误的代码,它没有被方法捕获):)。它可以是自定义的异常,例如NotFoundException
或ApplicationInternalErrorException
或SPL异常(exception)之一,例如RuntimeErrorException
或InvalidArgumentException
。没关系,真的。
当然,我们希望Dispatcher
捕获此异常,对其进行记录并相应地响应异常类型:如果捕获到NotFoundException
,则显示404页面,等等。
最佳做法是什么? 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 {
...
}
}
}
}
可以吗,还是不是很好的做法?
谢谢。
最佳答案
我只是使用一个外部文件(xml,yaml或任何您喜欢的文件),其中包含我的Web应用程序的所有路由。当请求到来时,路由器会尝试将请求url与文件中的路由之一进行匹配。如果没有匹配项,它将简单地使用404 header 重定向到404页面。我认为您不需要为此的try/catch块。
我从Symfony那里得到了这个想法。
关于php - 在MVC中处理错误/异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7085860/