CodeIgniter路由被控制器/方法覆盖

时间:2012-06-05 11:24:54

标签: php codeigniter routes

我在routes.php

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

我还有一个名为ctrller1的控制器,它有一个方法:

function method1 ($str = NULL) {
    // do something
}

问题是我必须使用controller2因为我不能或不应该编辑controller1。我想要的看似简单,但显然,CI不想和我合作。

当网址:
domain.com/ctrller1/method1/edit
调用,我希望调用ctrller1内的方法,如果domain.com/ctrller1/method1/videos/1
被调用我希望调用ctrller2中的方法。

这对我来说似乎都是正确的,但它不起作用。所以,我必须遗漏一些东西。我已经尝试将其添加到路由中:

$route['ctrller1/method1/(edit)'] = 'ctrller1/method1/($1)';

但这是不行的。有人在这里看错了吗?

2 个答案:

答案 0 :(得分:1)

在您使用路线的任何时候,就像权限(防火墙等)订单一样重要。通常,您希望按以下顺序组织路线:

  1. MOST DEFINED
  2. LESS DEFINED
  3. GENERAL / FALLBACK
  4. 澄清一下,这意味着您的路线订单应该是这样的:

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

    当调用URL时,路由表会经过并查找FIRST最接近的匹配,ELSE会遍历到下一个路径。

    在这种情况下你想要的是这样的:

      

    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/12355method1似乎令人困惑。但我再也没有详细说明。

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

答案 1 :(得分:0)

嗯,你在一个地方有video,在另一个地方有videos吗?

改为

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

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