CI扩展支持多级目录
2015-07-09 11:11
239 查看
由于原生的ci只支持2层目录,现扩展:将my_Router放在core文件中
<?php
if (!defined('ROOTPATH')) {
$url = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http') . '://' . $_SERVER["HTTP_HOST"] . '/error404';
header('Location: ' . $url, TRUE, 302);
exit();
}
/**
* 自定义路由类
*
* 让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
*
* @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[0].'.php'))
{
return $segments;
}
// Is the controller in a sub-folder?
if (is_dir(APPPATH.'controllers/'.$segments[0]))
{
$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[0].'.php'))
{
if ( ! empty($this->routes['404_override']))
{
$x = explode('/', $this->routes['404_override']);
$this->set_directory('');
$this->set_class($x[0]);
$this->set_method(isset($x[1]) ? $x[1] : 'index');
return $x;
}
else
{
show_404($this->fetch_directory().$segments[0]);
}
}
}
else
{
// Is the method being specified in the route?
if (strpos($this->default_controller, '/') !== FALSE)
{
$x = explode('/', $this->default_controller);
$this->set_class($x[0]);
$this->set_method($x[1]);
}
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[0]);
$this->set_method(isset($x[1]) ? $x[1] : 'index');
return $x;
}
// Nothing else to do at this point but show a 404
show_404($segments[0]);
}
}
// END MY_Router Class
<?php
if (!defined('ROOTPATH')) {
$url = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http') . '://' . $_SERVER["HTTP_HOST"] . '/error404';
header('Location: ' . $url, TRUE, 302);
exit();
}
/**
* 自定义路由类
*
* 让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
*
* @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[0].'.php'))
{
return $segments;
}
// Is the controller in a sub-folder?
if (is_dir(APPPATH.'controllers/'.$segments[0]))
{
$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[0].'.php'))
{
if ( ! empty($this->routes['404_override']))
{
$x = explode('/', $this->routes['404_override']);
$this->set_directory('');
$this->set_class($x[0]);
$this->set_method(isset($x[1]) ? $x[1] : 'index');
return $x;
}
else
{
show_404($this->fetch_directory().$segments[0]);
}
}
}
else
{
// Is the method being specified in the route?
if (strpos($this->default_controller, '/') !== FALSE)
{
$x = explode('/', $this->default_controller);
$this->set_class($x[0]);
$this->set_method($x[1]);
}
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[0]);
$this->set_method(isset($x[1]) ? $x[1] : 'index');
return $x;
}
// Nothing else to do at this point but show a 404
show_404($segments[0]);
}
}
// END MY_Router Class
相关文章推荐
- VB.NET中的DLL编写和调用的最简单示例
- 70个shell常用操作、 shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select
- Maven自定义绑定插件
- php结合curl实现多线程抓取
- Java基础日记———异常
- 视频录制压力,正反面录制视频
- zf-关于平台的用户名密码的设置
- 多线程的学习
- swift创建第一个UIButton 并增加点击事件
- solaris11.2下编译QT-配置命令
- Minimum Depth of Binary Tree
- 再谈mobile web retina 下 1px 边框解决方案
- ASP.NET - 对URL传递的值进行编码Server.UrlEncode()
- 如何在Vmware Horizon View 6.1中支持Windows XP
- JSTL开发实例详解
- GRE写作必备句型
- java web开发一个帐号同一时间只能一个人登录的功能
- Source Insight,修改字体
- 使用工具(JD-GUI和APKIDE)反编译JAR的方法
- Qt 创建一个线程执行某个函数