【问题标题】:The best way to deal with 404 errors in MVC?在 MVC 中处理 404 错误的最佳方法是什么?
【发布时间】:2012-11-11 12:49:56
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    由于我不知道您的 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() 检查控制器是否具有特定方法。

    P.S.在我看来,Dispatcher 概念更适合事件驱动架构,而不适合 Web 应用程序中受 MVC 启发的模式。

    【讨论】:

    • 我很确定如果在他的整个执行链中没有找到任何类或方法,这个方法就会触发。即使代码中只有一个错误,也会产生 404 错误。
    • 什么执行链?你有一些神奇的力量来阅读他的资料吗?另外,请注意短语“可以抛出”,这意味着您也可以专门从 Dispatcher 中抛出它。
    • 你是个让人难以忍受的teresko。正因为如此,我退出了这个问题。祝你好运。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢!这正是 MVC 现在的工作方式。你知道如何使用 PHP 检测 HTTP 500 错误吗? Dispatcher 如何知道它是 500 错误,因为如果 500 发生,应用程序根本不会启动?
    • 不是 100% 确定那个。您可以查看 php.ini 中的 register_shutdown_function。您还可以使用 .htaccess 查看 ErrorDocument 并将所有错误(或仅 500 个)路由到您的 :controller/:action。
    • 是的,你用它作为例子,这意味着你认为它是合适的。但事实并非如此。
    • 证明其他主要 MVC 框架使用相同的方法将您转发到特定控制器并在发现错误时执行操作是绝对合适的。
    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 2017-11-13
    • 2011-09-08
    • 2015-06-12
    • 2017-12-26
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多