【问题标题】:In a web MVC framework, who has the responsibility to show 404 page?在 Web MVC 框架中,谁负责显示 404 页面?
【发布时间】:2011-04-10 06:37:14
【问题描述】:

在 Web MVC 模型中,哪个类/对象有责任/功能调用 404 页面?为什么它有责任?我认为是路由器,但我只是在问以防万一。

$router->show_404("Unable to find controller.");

另外,404 页面应该是视图还是模板?这里的标准做法是什么?

-- 更新,让事情更清晰--

例如,如果我们同意 Router 类拥有调用 404 页面的功能/责任,那么我们是否应该将 Router 对象注入我们实例化的控制器,以便每个控制器都可以使用 Router 对象拨打404?或者我应该创建一个自定义类来显示“特殊页面”,例如错误/404s?

感谢您的回答。

【问题讨论】:

    标签: model-view-controller


    【解决方案1】:

    视情况而定。

    如果是由于路由无效,那么它可以由路由器自己处理,也可以有一个指向 404 处理程序的默认路由。

    如果是由于有效路由接收到无效数据(/user/JohnDoe,但系统不知道 John Doe),则必须由该路由的处理程序启动 404。

    一旦 404 被触发,我更喜欢报告它的轻便、快速的页面,但是有很多网站会,例如,进行近似匹配搜索并返回一个列表“你的意思是这些东西?”我不确定在这两种情况下我会以哪种方式称为“标准实践”,除非您谈论的是 REST API,它通常会发送最小的响应,因为它们的目标是机器可读性,所以没有很多提出一个只有人类才能回答的问题。

    【讨论】:

      【解决方案2】:

      我更喜欢在“驱动程序”中这样的东西:

      try
      {
        $router->handleRequest($request);
      }
      catch (Exception $e)
      {
        $view = new View('error');
        echo $view;
      }
      

      404 只是catch 块处理的另一个异常。如果你想用它做一些特别的事情,你总是可以有一个特定的 404 异常。或者您可以有一个通用的“http 异常”,其中包含一些指示要使用哪个模板的状态代码。

      【讨论】:

      • 如果我们加载控制器后才发现404怎么办?
      • @rickchristie,我的handleRequest 函数假设一切都发生在那里。重要的是,在 try {} 块内部的某个时刻,控制器的操作被调用。如果控制器的操作由于 id 无效而想要模拟 404,那么它只会抛出该异常。 (很可能,如果找不到路由,路由器将抛出相同的异常,但这只是一个次要的实现细节。)
      • 你的想法很有趣!非常感谢您的意见:)
      【解决方案3】:

      报告错误是视图的责任。并且需要相应地设计视图代码以报告有意义的错误消息

      <web-app ...> 
      
        <error-page>
          <error-code>404</error-code>
          <location>/WEB-INF/pages/404_error.jsp</location>
        </error-page>
      
      </web-app>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多