让Codeigniter控制器支持多级目录【支持2.1.4】
本帖最后由 longjianghu 于 2013-7-15 11:51 编辑支持目前最新的版本2.1.3,在以前的版本基础上做了点改进。使用方法:复制上面的代码新建一PHP文件MY_Router.php,放到Application/core目录下即可。
<?phpif ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* 自定义路由类
*
* 让CI控制器支持多级目录
*
* @author SOHOCN.NET
* @copyright Copyright © 2012 - 2018 www.sohocn.net All rights reserved.
* @created 2012-12-13
* @updated 2012-12-13
* @version 1.0
*/
class MY_Router extends CI_Router
{
/**
*Set the directory name
*
* @accesspublic
* @param string
* @returnvoid
*/
function set_directory($dir)
{
$this->directory = $dir.'/';
}
/**
* Validates the supplied segments.Attempts to determine the path to
* the controller.
*
* @accessprivate
* @param array
* @returnarray
*/
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' => array(), 'path' => APPPATH.'controllers/');
foreach($segments as $k => $v)
{
$temp['path'] .= $v.'/';
if(is_dir($temp['path']))
{
$temp['dir'][] = $v;
unset($segments[$k]);
}
}
$this->set_directory(implode('/', $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
329537000 发表于 2017-3-9 09:01
3.X版本试过这个方法function set_directory($dir) 这个函数有冲突报错 改个名后可以正常使用 谢谢分享思 ...
3.x默认已经支持多级目录 michaelzhouh 发表于 2013-12-13 12:16
这个是不是和MY_Controller.php有冲突啊?
为什么带目录之后,不执行MY_Controller的构造函数了呢?
不会冲突,看没看你代码输出.
mejinb 发表于 2014-5-6 11:05
楼主这种方式不支持2.1.4吗? 怎么按照您的操作试了以后还是404错误?
支持2.1.4,测试没有发现问题呢?
本帖最后由 longjianghu 于 2013-5-28 17:35 编辑
把上面的代码保存为MY_Router.php,放到应用的core目录里。:victory: longjianghu 发表于 2013-5-28 13:33 static/image/common/back.gif
把上面的代码保存为MY_Loader.php,放到应用的core目录里。
放到core目录里面就可以了吗? longjianghu 发表于 2013-5-28 13:33 static/image/common/back.gif
把上面的代码保存为MY_Loader.php,放到应用的core目录里。
放到core的目录里以后该怎么引用
本人是新手
能说详细的吗 羽毛 发表于 2013-5-28 14:48 static/image/common/back.gif
放到core的目录里以后该怎么引用
本人是新手
放到Core目录就支持多级目录了,你在控制器里新建多级目录试一下。 报错:( 当我把 category.php 放到 admin 的目录之后: 羽毛 发表于 2013-5-28 17:13 static/image/common/back.gif
当我把 category.php 放到 admin 的目录之后:
你是不是改了自定义前缀? 羽毛 发表于 2013-5-28 17:13 static/image/common/back.gif
当我把 category.php 放到 admin 的目录之后:
不好意思我说错了文件名应该保存为MY_Router.php longjianghu 发表于 2013-5-28 17:36 static/image/common/back.gif
不好意思我说错了文件名应该保存为MY_Router.php
改个名字就可以了:Q:Q:Q:Q
very very very very thank you