让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都测试通过!
posted @ 2015-01-19 16:46  北斗极星  阅读(749)  评论(0编辑  收藏  举报