Php 为什么';我的路线代码点火器不能转到正确的行动控制器吗?

Php 为什么';我的路线代码点火器不能转到正确的行动控制器吗?,php,codeigniter,Php,Codeigniter,这是我的路线 $route['posts/(:any)'] = 'posts/get_show/$1'; $route['posts/(:any)/dosomething'] ='posts/get_dosomething/$1'; 控制器 public function get_show($id) public function get_dosomething($id) 使用链接posts/1/dosomething,路由始终指向操作get\u show,它从不转到get\u dosome

这是我的路线

$route['posts/(:any)'] = 'posts/get_show/$1';
$route['posts/(:any)/dosomething'] ='posts/get_dosomething/$1';
控制器

public function get_show($id)
public function get_dosomething($id)
使用链接
posts/1/dosomething
,路由始终指向操作
get\u show
,它从不转到
get\u dosomething


知道怎么修吗?谢谢

你必须先这样走

$route['posts/(:any)/dosomething'] ='posts/get_dosomething/$1';
$route['posts/(:any)'] = 'posts/get_show/$1';

因为
posts/1/dosomething
总是位于$route['posts/(:any)]之下。改变你的一条路线条件

哦,天哪,那似乎很愚蠢。你能解释一下为什么它是这样工作的吗?因为这个
any
是贪婪的。与其他框架不同,CI将其视为任意数量的参数的可选项。。也不要跳到最后。。您在路线中说过,posts/(:any)正在调用get_show()。。。现在你在给posts/(:any/)打电话。。。因此,从CI来看,这一定是有点错误的方法任何一段都是一段。如果我说
post/foo
,那么就可以了。但是如果它是
post/foo/bar
,那么它就不应该通过该过滤器,因为有一个额外的段。为了解释为什么它按照匹配的第一个规则工作CI路由(而且很多系统都是这样做的,不仅仅是CI)。因为(:any)是一个通配符,所以它将匹配POST和stops之后第一段中的任何内容。你必须从最具体到最广泛的路线,记住这条规则,你会没事的。