2014-10-06 185 views
0

我已经叫控制器“项目”与指数自定义网址

我想的方法传递PROJECT_ID 它的工作原理与此网址: 网址:http://example.com/project/index/project_id

什么,我试图做的是有网址为每个项目 http://example.com/project_id 例如: http://example.com/rickyboby

我想这个代码 $route['(:any)'] = "project/index/$1"; 它的工作,我可以从url www.example.com/project_id访问project_id,但问题是我有其他控制器现在不工作,例如我有欢迎控制器,网址:www.example.com/welcome/是路由我到项目页面,我该如何解决?

+0

https://ellislab.com/codeigniter/user-guide/general/routing.html – Brewal 2014-10-06 19:32:02

+0

阅读有关RESTful路由。 – 2014-10-06 19:32:33

+0

可以通过路由 – Naincy 2014-10-06 19:36:44

回答

2

您需要将“any”规则前的所有控制器列入白名单,因为它们按顺序排列(因此在您的示例中,/welcome会将您带到project/index/welcome)。例如:

$route['welcome'] = "welcome"; 
$route['somethingElse'] = "someOtherUrl"; 
$route['(:any)'] = "project/index/$1"; 

你也可以试着想用正则表达式这样做的聪明的方式,但我认为你是一个白名单更好。


这是一个基本的编程概念,这里大概不属于,但你总是可以这样做:

$controllers = array('welcome', 'otherController', 'etc'); 
foreach($controllers as $c) { 
    $route[$c] = $c; // make all URLs from the list go to their same-named controllers 
} 
$route['(:any)'] = "project/index/$1"; // handle the other URLs 

一两件事 - 不要忘记,以防止用户从项目名称匹配现有的控制器名称(如welcome),因为他们的项目将无法访问!在那里,还有另一个原因让该控制器列表在某处...

+1

没有办法检测url之后的字符串是否与存在的控制器名称相匹配,如果是的话,我们会显示其他路由到我的项目控制器? – Kamal 2014-10-06 20:08:38

+0

这就是我的答案 - 你需要一个控制器列表(称为白名单),并首先检查它是否是其中的一个,如果不是,则转到项目控制器。你如何获得所有控制器的列表? – Shomz 2014-10-06 20:13:37

+1

是否有函数或方法来获取我所有控制器的列表,我不喜欢对它们进行硬编码。 – Kamal 2014-10-06 20:16:16

0

在“项目”路由规则之前放置“welcome”路由规则。这样系统将迎合欢迎,不会去寻找下一个规则。或者,您可以使用(:num)而不是(:any),这样它将只匹配数字(如果您的项目ID是数字)。

+0

我的项目ID是一个字符串,我应该为每个控制器添加一个路由吗?没有办法检测url之后的字符串是否与控制器名称相匹配,以显示它是否路由到我的项目控制器? – Kamal 2014-10-06 19:55:26