MVC - URI中没有控制器?

时间:2011-03-17 21:49:54

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

让我假装我正在尝试学习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...

3 个答案:

答案 0 :(得分:2)

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

它需要URI,可能验证它,并将其重新路由到(例如)“城市”控制器。

如果城市管制员找不到城市(指定了任何字符串),则需要发出适当的404.否则,您最好显示该城市的信息。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这与MVC无关,而且与良好的URL有关。

您正在寻找(a)从用户的角度清楚的网址,以及(b)为您的应用程序提供关于如何处理它的提示。

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

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

您的网址如下所示:

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/,您将有机会显示目的地列表。