标签:
MY_Router.php 放到 system/application/libraries 目录下,就可以让 CI 的控制器支持多级子目录了。
这样,你就可以在 system/application/controllers 目录下放置更多级别的目录,访问的方式就是 index.php/目录1/目录2/目录3/控制器/方法/参数
请注意,你不需要 load,因为这个类是系统自动 load 的。
MY_Router.php 代码
<?php if ( ! 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 * * @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
CodeIgniter 让控制器可以支持多级子目录的 Router 类库
标签:
原文地址:http://www.cnblogs.com/whlives/p/4206305.html