我routes.php
中有:
$route['ctrller1/method1/video/(:num)'] = 'ctrller2/method2/$1';
我还有一个名为 ctrller1
的控制器,它有一个方法:
function method1 ($str = NULL) {
// do something
}
问题是我必须使用控制器 2,因为我不能或不应该编辑控制器 1。我想要的看似简单,但显然,CI不想和我一起工作。
当网址:domain.com/ctrller1/method1/edit
被调用,我希望调用ctrller1
里面的方法,如果domain.com/ctrller1/method1/videos/1
被调用,我希望调用该方法ctrller2
。
这一切对我来说似乎是正确的,但它不起作用。所以,我一定错过了什么。我尝试将其添加到路由中:
$route['ctrller1/method1/(edit)'] = 'ctrller1/method1/($1)';
但这是不行的。有人在这里看到什么问题吗?
在任何时候使用路由,就像权限(防火墙等;)顺序很重要。 通常,您希望按以下顺序组织路由:
- 定义最明确
- 不太定义
- 常规/回退
澄清一下,这意味着您的路线订单应该是这样的:
$route['ctrller1/method1/videos/view/(:num)'] = 'ctrller2/method3/$1';
$route['ctrller1/method1/videos/(:num)'] = 'ctrller2/method2/$1';
$route['ctrller1/(:num)'] = 'ctrller2/method1/$1';
当 URL 被调用时,路由表会通过并找到第一个最接近的匹配项,否则它会遍历到下一个路由。
在这种情况下,您想要的是这样的内容:
domain.com/ctrller1/method1/videos/1 domain.com/ctrller1/method1/edit
这样做的原因是,视频的路由更具体,也是一个特殊情况,因为您将它路由到幕后的另一个控制器。
以下是您的路线应该是什么样子(未经过测试,但应该是这样):
$route['ctrller1/method1/videos/(:num)'] = 'ctrller2/method2/$1';
$route['ctrller1/method1/edit'] = 'ctrller1/method1';
顺便说一句,请注意,我很好奇为什么您将其格式化ctrller1/method1/videos/
而不是像 ctrller1/videos/view/12355
或 ctrller1/videos/edit/12355
之类的格式,method1
似乎令人困惑。但同样,我在这里没有所有的细节。
希望这对您有用,如果不是评论,如果您再澄清一下,我会重新审视您的问题。
那么你在一个地方有video
,在另一个地方有videos
?
要么更改为
$route['ctrller1/method1/videos/(:num)'] = 'ctrller2/method2/$1';
或尝试网址:domain.com/ctrller1/method1/视频/1