longjianghu 发表于 2013-5-28 09:59:47

让Codeigniter控制器支持多级目录【支持2.1.4】

本帖最后由 longjianghu 于 2013-7-15 11:51 编辑

支持目前最新的版本2.1.3,在以前的版本基础上做了点改进。使用方法:复制上面的代码新建一PHP文件MY_Router.php,放到Application/core目录下即可。


<?phpif ( ! 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
   *
   * @accesspublic
   * @param   string
   * @returnvoid
   */
    function set_directory($dir)
    {
      $this->directory = $dir.'/';
    }

    /**
   * Validates the supplied segments.Attempts to determine the path to
   * the controller.
   *
   * @accessprivate
   * @param   array
   * @returnarray
   */

    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.'.php'))
      {
            return $segments;
      }

      // Is the controller in a sub-folder?
      if (is_dir(APPPATH.'controllers/'.$segments))
      {
            $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.'.php'))
                {
                  if ( ! empty($this->routes['404_override']))
                  {
                        $x = explode('/', $this->routes['404_override']);

                        $this->set_directory('');
                        $this->set_class($x);
                        $this->set_method(isset($x) ? $x : 'index');

                        return $x;
                  }
                  else
                  {
                        show_404($this->fetch_directory().$segments);
                  }
                }
            }
            else
            {
                // Is the method being specified in the route?
                if (strpos($this->default_controller, '/') !== FALSE)
                {
                  $x = explode('/', $this->default_controller);

                  $this->set_class($x);
                  $this->set_method($x);
                }
                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);
            $this->set_method(isset($x) ? $x : 'index');

            return $x;
      }


      // Nothing else to do at this point but show a 404
      show_404($segments);
    }
}
// END MY_Router Class

longjianghu 发表于 2017-3-19 22:26:40

329537000 发表于 2017-3-9 09:01
3.X版本试过这个方法function set_directory($dir) 这个函数有冲突报错 改个名后可以正常使用 谢谢分享思 ...

3.x默认已经支持多级目录

longjianghu 发表于 2014-5-13 10:28:20

michaelzhouh 发表于 2013-12-13 12:16
这个是不是和MY_Controller.php有冲突啊?
为什么带目录之后,不执行MY_Controller的构造函数了呢?



不会冲突,看没看你代码输出.

longjianghu 发表于 2014-5-13 10:25:56

mejinb 发表于 2014-5-6 11:05
楼主这种方式不支持2.1.4吗? 怎么按照您的操作试了以后还是404错误?

支持2.1.4,测试没有发现问题呢?

longjianghu 发表于 2013-5-28 13:33:40

本帖最后由 longjianghu 于 2013-5-28 17:35 编辑

把上面的代码保存为MY_Router.php,放到应用的core目录里。:victory:

羽毛 发表于 2013-5-28 14:40:15

longjianghu 发表于 2013-5-28 13:33 static/image/common/back.gif
把上面的代码保存为MY_Loader.php,放到应用的core目录里。

放到core目录里面就可以了吗?

羽毛 发表于 2013-5-28 14:48:33

longjianghu 发表于 2013-5-28 13:33 static/image/common/back.gif
把上面的代码保存为MY_Loader.php,放到应用的core目录里。

放到core的目录里以后该怎么引用

本人是新手

能说详细的吗

longjianghu 发表于 2013-5-28 16:14:03

羽毛 发表于 2013-5-28 14:48 static/image/common/back.gif
放到core的目录里以后该怎么引用

本人是新手


放到Core目录就支持多级目录了,你在控制器里新建多级目录试一下。

羽毛 发表于 2013-5-28 17:11:59

报错:(

羽毛 发表于 2013-5-28 17:13:59

当我把 category.php 放到 admin 的目录之后:

longjianghu 发表于 2013-5-28 17:30:04

羽毛 发表于 2013-5-28 17:13 static/image/common/back.gif
当我把 category.php 放到 admin 的目录之后:

你是不是改了自定义前缀?

longjianghu 发表于 2013-5-28 17:36:08

羽毛 发表于 2013-5-28 17:13 static/image/common/back.gif
当我把 category.php 放到 admin 的目录之后:

不好意思我说错了文件名应该保存为MY_Router.php

羽毛 发表于 2013-5-28 17:51:19

longjianghu 发表于 2013-5-28 17:36 static/image/common/back.gif
不好意思我说错了文件名应该保存为MY_Router.php

改个名字就可以了:Q:Q:Q:Q

very very very very thank you
页: [1] 2 3 4
查看完整版本: 让Codeigniter控制器支持多级目录【支持2.1.4】