码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-06 17:09:46      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!