代码点火器路由被控制器/方法覆盖


CodeIgniter route overridden by controller/method

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)';

但这是不行的。有人在这里看到什么问题吗?

在任何时候使用路由,就像权限(防火墙等;)顺序很重要。 通常,您希望按以下顺序组织路由:

  1. 定义最明确
  2. 不太定义
  3. 常规/回退

澄清一下,这意味着您的路线订单应该是这样的:

$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/12355ctrller1/videos/edit/12355 之类的格式,method1似乎令人困惑。但同样,我在这里没有所有的细节。

希望这对您有用,如果不是评论,如果您再澄清一下,我会重新审视您的问题。

那么你在一个地方有video,在另一个地方有videos

要么更改为

$route['ctrller1/method1/videos/(:num)'] = 'ctrller2/method2/$1';

或尝试网址:domain.com/ctrller1/method1/视频/1