1

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

现在在 Dispatcher 中检查此 Controller 是否存在以及方法是否存在,如果控制器或方法不存在我该怎么办?

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

总是让错误控制器在出现错误时被实例化,并且会加载让我们说 Error404.html 视图文件的好方法是什么?因此,用户将能够自定义此视图文件以适合他们的应用程序设计。

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

谢谢!

4

2 回答 2

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 启发的模式。

于 2012-11-11T13:05:54.537 回答
1

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

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

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

sfContext::getInstance()->getController()->forward(sfConfig::get('sf_error_404_m‌​odule'), sfConfig::get('sf_error_404_action'));
于 2012-11-11T12:53:56.967 回答