【问题标题】:MVC - No Controller in the URI?MVC - URI 中没有控制器?
【发布时间】:2011-07-17 18:31:54
【问题描述】:

假设我正在尝试学习 CI,作为我的测试项目,我正在构建一个团购网站。

我希望每个城市都有不同的页面,例如:

http://www.groupon.com/las-vegas/
http://www.groupon.com/orlando/

我还想要不同的页面,例如:

http://www.groupon.com/learn
http://www.groupon.com/contact-us

如果我在 CI 中构建它并遵循 MVC 思想,这将如何工作?我很难看到如何使用以下概念完成所需的 URL:

http://www.domain.com/controller/view/segment_a/segment_b/etc...

【问题讨论】:

标签: php model-view-controller codeigniter url-rewriting controller


【解决方案1】:

这就是URI Routing 的用武之地。但在您的情况下,您可能必须小心地定义您的路线,因为您的路线的第一个也是唯一一部分已经是可变部分。

【讨论】:

    【解决方案2】:

    这确实与 MVC 无关,更多的是与良好的 URL 相关。

    您正在寻找的 URL 既 (a) 从用户的角度来看是清晰的,并且 (b) 可以为您的应用程序提供有关如何处理它的提示。

    在这种情况下,我要做的是稍微重新设计您的网址,而不是:

    http://www.groupon.com/las-vegas/
    http://www.groupon.com/orlando/
    

    你的 URL 应该是这样的:

    http://www.groupon.com/destinations/las-vegas/
    http://www.groupon.com/destinations/orlando/
    

    开头的位--/destinations/--可以被您的 URL 路由代码用来决定应该由哪个控制器来处理它。如果你的路由代码是基于 URL 的,你可能有一个这样的数组:

    $routes = array(
        '/destinations/' => 'on_destination_list',
        '/destinations/(.+)' => 'on_destination',
        '/(.*)' => 'on_page');
    
    // Basic URI routing code based off of REQUEST_URI
    foreach ($pattern => $func) {
        if (preg_match("`^$pattern$`", $_SERVER['REQUEST_URI'], $placeholders)) {
            array_shift($placeholders);
            call_user_func($func, $placeholders);
        }
    }
    

    请记住,我在头脑中编写了该路由代码,它可能不是绝对正确的。它应该为您提供您需要做什么的要点。

    以这种方式做事还有一个额外的好处,如果有人去http://www.groupon.com/destinations/,您将有机会显示目的地列表。

    【讨论】:

    • 感谢精彩的文章,不过我真的很想在 URI 中没有控制器。在我的问题中,这些是真正的 groupon 页面,我认为这样最有意义。
    • 我并没有真正直接映射到控制器。我已经添加到示例中以使其更清楚。另一种方法是,您首先捕获要路由的那些 URI 路径,例如 /learn/about-us,对于与现有路由不匹配的任何路径,您将它们视为目标名称。这一切都归结为同一件事,但 URI 的设计不同。
    • 是的,这很有意义,+1
    【解决方案3】:

    我要做的是创建一个自定义的 404 控制器,作为不存在的路由的包罗万象。

    它将获取 URI,可能会对其进行验证,然后将其重新路由到(例如)“城市”控制器。

    如果城市控制器找不到城市(无论指定什么字符串),那么它需要发出正确的 404。否则,您最好显示该城市的信息。

    此外,创建自定义 404 控制器后,您可以通过指定名为“404_override”的路由将所有 404 错误发送给它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2016-12-03
      • 2015-06-19
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      相关资源
      最近更新 更多