• 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
     
  • 相关阅读:
    python学习日记(OOP访问限制)
    python学习日记(OOP——@property)
    python学习日记(OOP——静态方法和类方法)
    python学习日记(isinstance和issubclass)
    python学习日记(OOP——反射)
    python学习日记(初识面向对象)
    python学习日记(内置、匿名函数练习题)
    python学习日记(内置函数)
    python学习日记(内置函数补充)
    Raft一致性协议
  • 原文地址:https://www.cnblogs.com/whlives/p/4206305.html
Copyright © 2020-2023  润新知