处理MVC中404错误的最佳方法是什么?

时间:2012-11-11 12:49:57

标签: php oop model-view-controller error-handling dispatcher

所以我编写了我的PHP MVC框架,并拥有Dispatcher类,可以实例化相应的Controller类并调用定义的方法传递参数。

现在在Dispatcher里面我检查这个Controller是否存在,如果方法存在,如果控制器或方法不存在我该怎么办?

目前我只返回打印404的HTTP对象 - 找不到页面。 但是我无法从内部应用程序自定义此消息,我想为用户提供一种自定义404消息的方法,而无需编辑调度程序。

是一个很好的方法去总是有错误控制器,当出现错误时会被实例化,那会加载让我们说Error404.html查看文件? 因此,用户可以自定义此视图文件以适合其应用程序设计。

还有其他方法可以实现吗?什么是从调度程序返回错误的最佳方法,让“用户”或正在使用该MVC的开发人员轻松自定义404和其他消息?

谢谢!

2 个答案:

答案 0 :(得分:2)

由于我不知道你的API,我猜。让我们假设您的应用程序中有一个引导阶段,当实际使用调度程序时。类似的东西:

$dispatcher->dispatch( $request );

然后,对于处理请求,尝试访问这些控制器中不存在的控制器或方法,您可以执行以下操作:

try
{
    $dispatcher->dispatch( $request );
}
catch ( ClassNotFoundException $e )
{
    $dispatcher->dispatch( new Request('/error/404/controller'));
}
catch ( MethodNotFoundException $e )
{
    $dispatcher->dispatch( new Request('/error/404/method'));
}

ClassNotFoundException可以由您的类加载器抛出,而调度程序本身将始终负责抛出MethodNotFoundException

在调度程序中执行控制之前,您可以使用method_exists()检查控制器是否具有特定方法。

  

PS 在我看来, Dispatcher 概念更适合于事件驱动的体系结构,而不适用于Web应用程序中受MVC启发的模式。

答案 1 :(得分:1)

我建议你有一个错误控制器,它接受一个错误代码(数字或字符串)作为参数。这使您可以优雅地处理各种错误,并在必要时提供堆栈跟踪。您甚至可以将此工作用于500个错误。

我的回答是假设控制器可以返回各种动作,每个动作都可以拥有它自己的模板。

Symfony似乎也以类似的方式处理错误。它们为每个错误都有一个单独的模块和操作。

sfContext::getInstance()->getController()->forward(sfConfig::get('sf_error_404_m‌​odule'), sfConfig::get('sf_error_404_action'));