让Codeigniter控制器支持多级目录

<?php
if (!defined('BASEPATH')) { exit ('No direct script access allowed');}
class MY_Router extends CI_Router {
public function __construct() {
parent :: __construct();
$this->agent=load_class('user_agent');
//$this->directory='mobile/';
if ($this->agent->is_mobile()) {
$this->directory='mobile/';
} }
function set_directory($dir) {
$this->directory = $this->directory.$dir . '/';
}
function _validate_request($segments) {
if (count($segments) == 0) {
return $segments;
}
if (file_exists(APPPATH . 'controllers/'.$this->fetch_directory() . $segments[0] . '.php')) {
return $segments;
}
if (is_dir(APPPATH . 'controllers/' .$this->fetch_directory(). $segments[0])) {
$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) {
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 {
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');
}
if (!file_exists(APPPATH . 'controllers/' . $this->fetch_directory() . $this->default_controller . '.php')) {
$this->directory = '';
return array ();
} }
return $segments;
}
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;
}
show_404($segments[0]);
}
}
使用方法:把上面的代码另存为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都测试通过!
上一篇:PHP 支持中文目录和文件的的遍历:文件编码转换


下一篇:Windows Azure Storage (22) Azure Storage如何支持多级目录