我最近将一个站点从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。
任何人都有线索吗?或者需要更多信息来帮助?谢谢!
答案 0 :(得分:0)
我假设/ about / locations正在查找about文件夹中的实际“位置”控制器,而不是基本控制器的方法。就CI而言,您正在尝试执行以下两个函数之一:
因此,任何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
控制器(无论您是否将其命名为其他内容)。