MY_Router.php 放到 system/application/libraries 目录下,就可以让 CI 的控制器支持多级子目录了。
这样,你就可以在 system/application/controllers 目录下放置更多级别的目录,访问的方式就是 index.php/目录1/目录2/目录3/控制器/方法/参数
请注意,你不需要 load,因为这个类是系统自动 load 的。

MY_Router.php 代码

  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2. /**
  3. * 自定义路由类
  4. *
  5. * 让CI控制器支持多级目录
  6. *
  7. * @author SOHOCN.NET
  8. * @copyright Copyright © 2012 - 2018 www.sohocn.net All rights reserved.
  9. * @created 2012-12-13
  10. * @updated 2012-12-13
  11. * @version 1.0
  12. */
  13.  
  14. class MY_Router extends CI_Router
  15. {
  16. /**
  17. * Set the directory name
  18. *
  19. * @access public
  20. * @param string
  21. * @return void
  22. */
  23. function set_directory($dir)
  24. {
  25. $this->directory = $dir.'/';
  26. }
  27.  
  28. /**
  29. * Validates the supplied segments. Attempts to determine the path to
  30. * the controller.
  31. *
  32. * @access private
  33. * @param array
  34. * @return array
  35. */
  36.  
  37. function _validate_request($segments)
  38. {
  39. if (count($segments) == 0)
  40. {
  41. return $segments;
  42. }
  43.  
  44. // Does the requested controller exist in the root folder?
  45. if (file_exists(APPPATH.'controllers/'.$segments[0].'.php'))
  46. {
  47. return $segments;
  48. }
  49.  
  50. // Is the controller in a sub-folder?
  51. if (is_dir(APPPATH.'controllers/'.$segments[0]))
  52. {
  53. $temp = array('dir' => array(), 'path' => APPPATH.'controllers/');
  54.  
  55. foreach($segments as $k => $v)
  56. {
  57. $temp['path'] .= $v.'/';
  58.  
  59. if(is_dir($temp['path']))
  60. {
  61. $temp['dir'][] = $v;
  62. unset($segments[$k]);
  63. }
  64. }
  65.  
  66. $this->set_directory(implode('/', $temp['dir']));
  67. $segments = array_values($segments);
  68. unset($temp);
  69.  
  70. if (count($segments) > 0)
  71. {
  72. // Does the requested controller exist in the sub-folder?
  73. if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php'))
  74. {
  75. if ( ! empty($this->routes['404_override']))
  76. {
  77. $x = explode('/', $this->routes['404_override']);
  78.  
  79. $this->set_directory('');
  80. $this->set_class($x[0]);
  81. $this->set_method(isset($x[1]) ? $x[1] : 'index');
  82.  
  83. return $x;
  84. }
  85. else
  86. {
  87. show_404($this->fetch_directory().$segments[0]);
  88. }
  89. }
  90. }
  91. else
  92. {
  93. // Is the method being specified in the route?
  94. if (strpos($this->default_controller, '/') !== FALSE)
  95. {
  96. $x = explode('/', $this->default_controller);
  97.  
  98. $this->set_class($x[0]);
  99. $this->set_method($x[1]);
  100. }
  101. else
  102. {
  103. $this->set_class($this->default_controller);
  104. $this->set_method('index');
  105. }
  106.  
  107. // Does the default controller exist in the sub-folder?
  108. if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php'))
  109. {
  110. $this->directory = '';
  111. return array();
  112. }
  113.  
  114. }
  115.  
  116. return $segments;
  117. }
  118.  
  119. // If we've gotten this far it means that the URI does not correlate to a valid
  120. // controller class. We will now see if there is an override
  121. if ( ! empty($this->routes['404_override']))
  122. {
  123. $x = explode('/', $this->routes['404_override']);
  124.  
  125. $this->set_class($x[0]);
  126. $this->set_method(isset($x[1]) ? $x[1] : 'index');
  127.  
  128. return $x;
  129. }
  130.  
  131. // Nothing else to do at this point but show a 404
  132. show_404($segments[0]);
  133. }
  134. }
  135. // END MY_Router Class

CodeIgniter 让控制器可以支持多级子目录的 Router 类库的更多相关文章

  1. Windows Azure Storage (22) Azure Storage如何支持多级目录

    <Windows Azure Platform 系列文章目录> 熟悉Azure平台的读者都知道,Azure Blob有三层架构.如下图:(注意blob.core.chinacloudapi ...

  2. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  3. 自动创建WIN32下多级子目录的C++封装类

            这是 WIN32 自动创建多级子目录的 C++ 封装类,用法简单.         封装没有采用类的静态函数方式,而是在构造函数里面直接完成工作.没什么具体的原因,只是当时做成这样了, ...

  4. C#实现多级子目录Zip压缩解压实例

          参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩,类似winrar,可以选择 ...

  5. 怎样使用md命令一次建立多级子目录

    https://jingyan.baidu.com/article/37bce2be30cae21002f3a224.html 点击开始,运行,在运行窗口中输入“cmd”.   打开cmd窗口之后,用 ...

  6. windows下怎样使用md命令一次建立多级子目录

    在Windows系统中一次只能够创建一个子目录,在命令提示符窗口则可以一次性创建多个子目录,例如如果想在f盘创建多级子目录,则md 23\13\65\45,后面的数字随便都可以.如果想一次性删除多级目 ...

  7. ZIP解压缩文件的工具类【支持多级文件夹|全】

    ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...

  8. 运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

    一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffm ...

  9. 【运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

    一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffm ...

随机推荐

  1. (转)Web自动化测试中的接口测试

    1.背景 1.1 Web程序中的接口 1.1.1 典型的Web设计架构 web是实现了基于网络通信的浏览器客户端与远程服务器进行交互的应用,通常包括两部分:web服务器和web客户端.web客户端的应 ...

  2. 对SIGQUIT的实验 & Java dump

    写了一个Java程序,sleep 20秒. package com.company; public class Main { public static void main(String[] args ...

  3. CodeForces 185A 快速幂

    一开始找矩阵快速幂的题来做时就看到了这题,题意就是让你求出如图所示的第n个三角形中指向向上的小三角形个数.从图中已经很容易看出递推关系了,我们以f[n]表示第n个大三角形中upward的小三角形个数, ...

  4. git命令之git rebase 的用法

    rebase 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 现在我 ...

  5. C++常量(C++数值常量、字符串常量、符号常量)

    http://see.xidian.edu.cn/cpp/biancheng/view/104.html 字符串常量 用双撇号括起来的部分就是字符串常量,如"abc"," ...

  6. HTML介绍、文档基本结构、meta标签、HTML标记的语法

    一.HTML的介绍 Hyper Text Mark-up Language 超文本标记语言,是一种描述性标记语言(不是编程语言),主要用于描述网页(可以有图像,文字,声音,等..)但没有交互性 HTM ...

  7. Linux大文件分割split和合并cat使用方法

    本文主要介绍linux下两个命令:split和cat.其中,相信大家都熟悉cat命令,一般用来查看一个文件的内容,但是它还其它的功能,比如这里要介绍的文件合并功能,它可把多个文件内容合并到一个文件中. ...

  8. MySQL内核深度优化

    版权声明:本文由简怀兵原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/179 来源:腾云阁 https://www.qclo ...

  9. 如何增加Asp.Net Core生成的模板网站中用户信息表中的列(AspNetUsers)

    环境: 1.VS2015 Community 14.0.25431.01 Update 3; 2.其他环境(具体哪一个影响不太清楚,都列在这儿) 使用的系统模板 利用系统提供的模板,并选择个人身份验证 ...

  10. 利用mycat实现mysql数据库读写分离

    1.这里是在mysql主从复制实现的基础上,利用mycat做读写分离,架构图如下: 2.Demo 2.1 在mysql master上创建数据库创建db1 2.2 在数据库db1创建表student ...