让我假装我正在尝试学习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...
答案 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/
,您将有机会显示目的地列表。