CodeIgniter 让控制器可以支持多级子目录的 Router 类库

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
 
时间: 2024-08-01 03:45:58

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

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

<Windows Azure Platform 系列文章目录> 熟悉Azure平台的读者都知道,Azure Blob有三层架构.如下图:(注意blob.core.chinacloudapi.net是Azure China的Service Endpoint) 1.Blob Name: 存储账号名称 2.Container Name,容器名称.概念上类似于文件夹 3.Blob Name:文件名称 Azure Storage Block Blob概念上类似网盘,用户可以把文件.图片.照片直接保存到A

apache ant解压zip。支持多级目录解压

package cn.liuc.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tool

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

在Windows系统中一次只能够创建一个子目录,在命令提示符窗口则可以一次性创建多个子目录,例如如果想在f盘创建多级子目录,则md 23\13\65\45,后面的数字随便都可以.如果想一次性删除多级目录,则用rd. 1. 点击开始,运行,在运行窗口中输入“cmd”. 2. 打开cmd窗口之后,用md创建一个多级子目录,例如,在f盘下创建一个11\22\33\44的多级子目录. 3. 回车之后,虽然没有提示,但是确实已经在f盘下创建了一个11\22\33\44的多级文件. 4. 如果想删除这个多级

winfrom递归生成菜单,支持多级嵌套

private void Form2_Load(object sender, EventArgs e) { CreateMenu(); } private void CreateMenu() { //定义菜单条 Bar bar = new Bar("Menu Bar"); bar.MenuBar = true; bar.Stretch = true; bar.Style = eDotNetBarStyle.Office2003; dotNetBarManager1.Bars.Add(b

创建目录(单个目录和多级子目录)方法

1. CreateDirectory 创建文件夹(只能创建一级目录) C\C++ 函数原型: CreateDirectory( LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes ); 简介: CreateDirectory 是Win32API函数,用于创建文件夹.     参数 lpPathName 表示路径    参数 lpSecurityAttributes 表示安全属性 ======================

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

? ? 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩,类似winrar,可以选择是否排除基准目录 ? ? ? ? ? ? ? ? ? ? 测试代码 ? ? public?void?ZipDirectoryTest()??? {??? string?path?=?System.IO.Path.Combine(System.IO.Path.GetTempPath(),?DateTime

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

一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffmpeg的时候已经写了一部分Java的命令控制功能了,有些代码就拿过来改改用了(其实是为了偷懒qaq) 二.实现功能 1.进程管理 只支持本程序启动的进程管理,本程序主要功能是定时执行某些脚本或者系统命令,当然命令行和脚本是很自由的,更多用法请自行探索 2.定时命令.任务 3.重复定时命令.任务 4.

Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 一.概述 最近在研究QTableView支持多级表头的事情,百度了下网上资料还是挺多的.实现的方式总的来说有2种,效果都还不错,最主要是搞懂其中的原理,做到以不变应万变. 实现多级表头的方式有以下两种方案 行表头和列表头都是用一个表格去模拟 重写QHeadView 以上两种方式都可以实现多级表头,各

H3C无线控制器portal支持https重定向的经验汇总

问题现象 https网站越来越普及,部分客户反馈portal组网下https无法成功重定向 在放通了DNS地址后,手机.笔记本终端,浏览器输入IP地址.http域名能够正常重定向,输入HTTPS域名,如百度(https://www.baidu.com/)等无法触发portal重定向,导致客户投诉. 解决方案 (1)V5:(R2509P52及之后版本开始支持) 先配置ssl server-policy ssl server-policy xxx 再跟portal https-redirect关联起