让Codeigniter控制器支持多级目录【支持2.1.2】
本帖最后由 longjianghu 于 2013-7-3 15:07 编辑CodeIgniter(后面简称CI) 是一个小巧但功能强大的 PHP 框架,这也是我选择它的原因。在实际的项目开发过程中,有时需要使用多级目录的情况,这时它的问题就出来了。
CI默认的控制器只支持一级目录。这时CI灵活的扩展功能可以大展身手了。下面我扩展了一下让Codeigniter支持多级目录。代码如下:
< ?phpif ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* MY_Router Class
*
* Parses URIs and determines routing
*
* @author Longjianghu QQ:215241062
* @copyright Copyright © 2012-2013 www.spenote.com. All rights reserved.
* @created 2012-06-21
* @updated 2012-06-21
* @link http://www.spenote.com/php/codeigniter_route.html
*/
class MY_Router extends CI_Router
{
// --------------------------------------------------------------------
/**
*Set the directory name
*
* @access public
* @param string
* @return void
*/
function set_directory($dir)
{
$this->directory = $dir.'/';
}
/**
* Validates the supplied segments.Attempts to determine the path to
* the controller.
*
* @access private
* @param array
* @return array
*/
function _validate_request($segments)
{
if (count($segments) == 0)
{
return $segments;
}
// Does the requested controller exist in the root folder?
if (file_exists(APPPATH.'controllers/'.$segments.'.php'))
{
return $segments;
}
// Is the controller in a sub-folder?
if (is_dir(APPPATH.'controllers/'.$segments))
{
$temp = array('dir' => '', 'number' => 0, 'path' => '');
$temp['number'] = count($segments) - 1;
for($i = 0; $i <= $temp['number']; $i++)
{
$temp['path'] .= $segments[$i].'/';
if(is_dir(APPPATH.'controllers/'.$temp['path']))
{
$temp['dir'][] = str_replace(array('/', '.'), '', $segments[$i]);
}
}
$this->set_directory(implode('/', $temp['dir']));
$segments = array_diff($segments, $temp['dir']);
$segments = array_values($segments);
unset($temp);
if (count($segments) > 0)
{
// Does the requested controller exist in the sub-folder?
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments.'.php'))
{
if ( ! empty($this->routes['404_override']))
{
$x = explode('/', $this->routes['404_override']);
$this->set_directory('');
$this->set_class($x);
$this->set_method(isset($x) ? $x : 'index');
return $x;
}
else
{
show_404($this->fetch_directory().$segments);
}
}
}
else
{
// Is the method being specified in the route?
if (strpos($this->default_controller, '/') !== FALSE)
{
$x = explode('/', $this->default_controller);
$this->set_class($x);
$this->set_method($x);
}
else
{
$this->set_class($this->default_controller);
$this->set_method('index');
}
// Does the default controller exist in the sub-folder?
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php'))
{
$this->directory = '';
return array();
}
}
return $segments;
}
// If we've gotten this far it means that the URI does not correlate to a valid
// controller class.We will now see if there is an override
if ( ! empty($this->routes['404_override']))
{
$x = explode('/', $this->routes['404_override']);
$this->set_class($x);
$this->set_method(isset($x) ? $x : 'index');
return $x;
}
// Nothing else to do at this point but show a 404
show_404($segments);
}
}
// END MY_Router Class
使用方法:把上面的代码另存为MY_Router.php,放在你应用目录的core目录下。假设你的应用放在application目录,哪么你把MY_Router.php文件放在application/core目录下即可:原生的CI最多只支持一级目录,地址如下:controllers/directory/appname.php,现在你可以写成controllers/directory/directory/directory/appname.php,如果你不觉得累写多少都没关系 (^0^)。现目前在Codeigniter 2.1.0、Codeigniter 2.1.1、Codeigniter 2.1.2都测试通过!
zailushang 发表于 2015-11-27 16:54
**** 作者被禁止或删除 内容自动屏蔽 ****
index是你自己的路由配置和这个多级目录无关 楼主你好,如果使用My_router 路由就会不默认找index 文件了 ,这个怎么解决???谢谢 楼主,增加my_router 后,所有的输出都多了个换行符,这是为什么怎么解决呢 这个必须要顶一下 jason_wang_666 发表于 2012-6-26 22:33 static/image/common/back.gif
这个必须要顶一下
谢谢支持 必须支持,帮了大忙 远之影 发表于 2012-7-13 10:19 static/image/common/back.gif
必须支持,帮了大忙
:$门前冷落鞍马稀,感谢支持。 支持 求。2.1.2 的 楼主厉害。 ulpyuxa 发表于 2012-7-28 16:37 static/image/common/back.gif
楼主厉害。
谢谢支持 很好 很强大