Codeigniter 框架多级目录访问问题

来源:互联网 发布:高等电网络理论 编辑:程序博客网 时间:2024/05/18 01:43

在之前的文章中,我们基于codeigniter框架实现了插件结构。在controllers目录添加了plugin目录用来存放插件,例如我们添加了一个插件,将该插件的controller目录放到plugin下,这样访问地址就是../index.php?/plugin/插件包名/插件controller,这就涉及了多级目录问题。解决该问题我们需要在application的core目录下新建一个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的多级目录访问。


原创粉丝点击