我正在设计一个系统,其中uri看起来如下
my-app.com/client-name/admin/foo
my-app.com/client-name/admin/bar
客户名称是可变的。显然,我想将管理控制器放在子文件夹中以保持我的理智。所以我的文件夹看起来如下......
/application/controllers/admin/foo.php
/application/controllers/admin/bar.php
问题:
来自文档: “将控制器组织到子文件夹中 使用此功能时,URI的第一段必须指定文件夹。“
无论如何都要绕过这个?
我可以创建管理控制器吗
/application/controllers/admin.php
使用_remap函数从子文件夹手动加载控制器?
更新
我的路线看起来像这样
// Admin Root
$route['(:any)/admin'] = "admin/welcome";
然后在任何控制器加载之前,我验证第一个URI段以确保客户端存在。
所有客户端都使用相同的控制器和路由。
答案 0 :(得分:4)
您可以尝试扩展路由方法。像:
<?php
/*
* Custom router function v 0.1
*
* Add functionality : read into more than one sub-folder
*
*/
Class MY_Router extends CI_Router
{
Function MY_Router()
{
parent::CI_Router();
}
function _validate_request($segments)
{
if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
{
return $segments;
}
if (is_dir(APPPATH.'controllers/'.$segments[0]))
{
$this->set_directory($segments[0]);
$segments = array_slice($segments, 1);
/* ----------- ADDED CODE ------------ */
while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
{
// Set the directory and remove it from the segment array
$this->set_directory($this->directory . $segments[0]);
$segments = array_slice($segments, 1);
}
/* ----------- END ------------ */
if (count($segments) > 0)
{
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
{
show_404($this->fetch_directory().$segments[0]);
}
}
else
{
$this->set_class($this->default_controller);
$this->set_method('index');
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
{
$this->directory = '';
return array();
}
}
return $segments;
}
show_404($segments[0]);
}
}
?>
尽管这种方法可能并不适用于所有人,但从长远来看可能会导致更多问题,但是如果你想因为某种原因分离出你的控制器,那么这是可能的。但是需要做一些相当多的调整才能开始工作。注意:您可能希望通过全新安装执行此操作,并确保这是您想要处理的事情。
我不赞成上面的代码,原始参考可以在这里找到。 http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/
答案 1 :(得分:0)
如果你手动设置你的路线,结果就是这样。
真棒!