2

让我们假装我正在努力学习CI,并且作为我的测试项目,我正在构建一个团购网站。MVC - URI中没有控制器?

我想的是让每个城市不同的页面,如:

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... 
+1

重新映射我应该看的地方? http://codeigniter.com/user_guide/general/controllers.html#remapping – 2011-03-17 22:08:53

回答

2

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

它将采取的URI,可能对其进行验证,并且它重新路由到(例如)“城市”控制器。

如果城市控制器无法找到城市(无论是指定的字符串),那么它需要发出适当的404,否则,你就可以显示你的信息,该城市。

而且,一旦你创建自定义404控制器,你可以通过指定一个名为“404_override”路线把所有404错误吧。

1

这就是URI Routing进来,但在你的情况,你可能将不得不小心定义你的路由作为第一和只有部分路线已经是可变部分。

1

这实际上与MVC无关,还有更多关于良好URL的内容。

你要找的是双方的URL(一)但从用户的角度和明确的(b)该给的提示,你的应用程序,以它是如何打算处理。

我会做什么在这种情况下略微重新设计你的URL,这样,而不是:

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

+0

非常感谢这篇精彩的文章,但我确实希望在URI中没有控制器。这些都是我的问题中真正的群组页面,我认为这是最有意义的。 – 2011-03-17 22:40:25

+1

我不是真的直接映射到控制器。我已经加入了这个例子来说明这一点。另一种方法是,你首先捕获你想要路由的URI路径,比如'/ learn'和'/ about-us',对于任何现有路由不匹配的路径,将它们视为目标名称。这一切都归结为相同的事情,但URI的设计不同。 – 2011-03-17 22:48:57

+0

是的,这很有意义,+1 – 2011-03-17 22:57:16