2011-10-01 57 views
6

我有Codeigniter路由的问题。我希望我网站上的所有注册用户都拥有自己的“目录”,例如:www.example.com/username1,www.example.com/username2。这个“目录”应该映射到控制器“polica”,方法“ogled”,参数“username1”。Codeigniter中的路由 - 自动

如果我这样做,那么每个控制器都映射到此路线:“polica/ogled/parameter”。这是不正常:

$route["(:any)"] = "polica/ogled/$1"; 

这工作,但我一直在手动输入routes.php信息:

$route["username1"] = "polica/ogled/username1"; 

如何做到这一点,这将是全自动的吗?

更新: 例如,我有控制器名称ads。例如,如果您访问www.example.com/ads/ 则会列出广告。如果您访问www.example.com/username1,则会列出用户username1的广告。还有控制器userprofilelatest,...

我目前routes.php

$route['oglasi'] = 'oglasi'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

我解决了问题,这个代码:

$route['oglasi/(:any)'] = 'oglasi/$1'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

问候,马里奥

+0

辉煌!我只是用默认的控制器做到了这一点,它也在那里工作。 –

回答

23

的你的路线问题是,通过使用:任何你匹配,实际上......任何路线,所以你几乎卡在那里。 我想你可能有两种解决方法:

1)你可以有选择地重新路由所有站点控制器独立,如:

$route['aboutus'] = "aboutus"; 
$route['where-we-are'] = "whereweare"; 
//And do this for all your site's controllers 
//Finally: 
$route['(:any)'] = "polica/ogled/$1"; 

所有这些路线必须来之前的任何,因为它们在读它们被呈现的顺序,如果你在开始时放置:any,它将愉快地跳过所有其余的。评论后

编辑:

我的意思是,如果你要来匹配任何部分,这意味着你不能使用在所有的任何控制器(这是在默认情况下,第一个URI段),因为路由器将始终使用您定义的法则重新路由您。 为了允许CI执行其他控制器(不管它们是什么,我只是使用了一些常见的网页,但可以从字面上理解所有内容),您需要通过从重新路由中排除它们来允许它们。你可以通过将它们放在你的ANY规则之前来实现这一点,这样每当CI通过你的路由规则时,它首先解析你“逃脱”的路由规则,并且只要它们不匹配它在URL上找到的任何东西,到:任何规则。

我知道这是一个代码冗长,但他们肯定会少于6K,正如你所说的。 由于我不知道您的网址和网络应用程序的实际结构,因此这是我想到的唯一解决方案。如果你提供进一步的信息,比如如何塑造了你的应用程序的正规网址,然后我可以更新我的答案

/编辑完

这不是太大的之实践的解决方案,因为它需要一个很多代码,但如果你想要这样的设计,这是我想到的唯一方法。 另外,考虑到你可以使用正则表达式作为$ route索引,但是我不认为它可以在这里工作,因为你的用户名不可能以这种方式匹配,但我只是想指出可能性。

OR

2)您可以沿

$route['user/(:any)'] = "polica/ogled/$1"; 

这行稍微改变你的设计模式,并为其分配的用户名另一条路线,事情会产生相当漂亮(和语义)网址尽管如此,并且将避免逃避其他路线的所有麻烦。

+0

谢谢您的回复。我无法使用你的第二个解决方案,因为我的客户希望在域名后面有用户名。我不明白你的第一个解决方案。你能向我解释一下我的情况吗?我的目标是用更少的代码解决这个问题。现在,我在我的'routes.php'文件中有大约6000行 - 我不喜欢这个:/ – Puzo

+0

@Puzo我更新了我的答案,并解释了第一个解决方案。是的,6000条路线肯定是太多了。 –

+0

我更新了我的第一个问题。你需要更多的信息吗?哪一种? – Puzo

1

最近我还在为这个问题苦苦挣扎。我创建了这样对我有用的东西:

remap方法定义一个“重定向”控制器。这将允许您将发送到控制器的请求与任何正在进行的变量字符串合并为一个函数。因此,如果请求http://yoursite/jeff/http://yoursite/jamie它不会击中这些方法,而是击中http://yoursite/重映射函数。 (即使这些方法/名称不存在,即使你有一个索引函数,它也会取代它)。在_Remap方法中,您可以定义一个条件开关,然后与您的其他代码一起工作,以您想要的任何方式重新指导用户。

然后,您应该定义此重直控制器作为默认的和设置您的路线,像这样:

$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

这是起初有点问题​​的,因为这将基本上强制所有内容被重新 - 无论什么,最终通过这个_remap开关直接控制这个控制器。

但是你可以做的是定义你不想在这些路由语句之上遵守这个条件的规则/路由。

$route['myroute'] = "myroute"; 
$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

我发现,这产生了很好的系统,哪里哪里,我能重定向他们很容易把他们主张通过一个控制器我可以有很多的变量作为用户定义。

+0

嗯..所以如果我理解正确,我应该在'routes.php'文件中定义所有的控制器,然后在底部定义重定向规则?影响页面的性能? – Puzo

+0

@Puzo阅读您的评论,这几乎是我想在我的答案中说.. –

+0

@Chamilyan我怎么可以替换#与/与URL与路由 – Bugfixer

1

另一种方式是声明数组与intenal控制器和从笨在routes.php文件文件重定向一切像这样用户控制器:

$controllers=array('admin', 'user', 'blog', 'api'); 
if(array_search($this->uri->segment(1), $controllers)){ 
    $route['.*'] = "polica/ogled/$1"; 
}