Codeigniter 2.0.x - Controller子目录默认控制器需要在URL中

时间:2011-11-15 22:20:55

标签: codeigniter controller codeigniter-2

我最近将一个站点从CodeIgniter 1.7.x升级到2.0.3。大约在同一时间,我的组织中有人要求我们向网站添加一些页面。在一个部分下面。在旧版本的网站中,我在控制器中使用了一些解决方法来分解更长的URL。但在版本2中,我发现我应该能够使用controllers文件夹中的子目录以更恰当的方式执行它。在遍布整个地方后,我尝试了各种路由声明,并摆弄各种各样的东西。希望我做的事情简单,错误,或者有人看到了类似的升级问题。

我正在尝试从以下内容获取网址:

/about/locations

以前用于名为about.php的控制器。更像是:

/about/social_responsibility/commitment

about现在是aub目录。

有趣的是,目前它确实有点工作。第二个URL正确显示。然而,我的旧页面,第一个URL,现在不起作用...我的新结构在about目录中使用base.php(default_controller)。因此,如果我写:

/about/base/locations

确实有效。但我认为整个路由事件(default controller)和使用子目录应该清理URL。

我的信息如下......

当前路由(在过去几个小时内改变了一堆)

$route['default_controller'] = "base";
$route['404_override'] = '';

$route['about'] = "about/base";

目录和文件

/controllers/about/base.php
/controllers/about/social_responsibility.php

base.php的块

class Base extends MY_Controller
{
public function __construct()
{
    parent::__construct();
    $this->data['parent'] = "About";

    $this->load->model('mnav');
}

public function index()
{

}

public function locations()
{

}
}

我还有MY_Controller扩展CI_Controller,但它只是在开发环境中为我启用FirePHP。

任何人都有线索吗?或者需要更多信息来帮助?谢谢!

2 个答案:

答案 0 :(得分:0)

我假设/ about / locations正在查找about文件夹中的实际“位置”控制器,而不是基本控制器的方法。就CI而言,您正在尝试执行以下两个函数之一:

  1. 关于控制器的“位置”方法
  2. about / Locations控制器的索引方法(显然不存在)
  3. 因此,任何3段或更高的URI都可以使用此方案,但2段URI将会混淆它。我不认为让CI回退到默认控制器会在这里工作。试试这个:

    $route['default_controller'] = "base";
    $route['404_override'] = '';
    
    $route['([^\/]*)'] = '$1/base';
    $route['([^\/]*)/([^\/]*)'] = '$1/base/$2';
    

答案 1 :(得分:0)

我刚刚使用CI 2.0.2在我的系统上进行了测试,似乎默认控制器设置也适用于子目录,没有任何其他路径。

// so in your config file, whatever your default_controller is set to...
// you would just use that as the name of the `base` controller in about

// for example, if your default_controller is 'welcome' 
// in /application/config.php
$route['default_controller'] = "welcome";
$route['404_override'] = '';

// then, it should work for the subdirectory where there is a controller 
// named 'welcome'

//  application/controllers/about/base.php
class Welcome extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        echo "I can be reached with /about";
    }
}

因此,您所要做的就是删除about

的所有路由
// remove this
$route['about'] = "about/base";

重要 这仅在访问/关闭时有效 - 其他段中的任何内容都将寻找其他控制器。因此,您必须考虑如何访问base控制器(无论您是否将其命名为其他内容)。