大道达人 发表于 2011-9-13 18:45:44

CI路由的一点改造

本帖最后由 大道达人 于 2011-9-15 13:12 编辑

CI2.0 controller层目前只支持2级目录引用即http://xx.com/admin/notice/detail/1实际应用中如果需要
http://xx.com/admin/site/notice/detail/1
http://xx.com/admin/site/sys/notice/detail/1
小弟尝试改造了下CI路由,代码如下

      function _validate_request(&$segments ,$flag = FALSE)
      {
                if (count($segments) == 0)
                {
                        return $segments;
                }
               
                // Does the requested controller exist in the root folder?
                if (file_exists(APPPATH.'controllers/'.$segments.EXT) && $flag === FALSE)
                {
                        return $segments;
                }

                // Is the controller in a sub-folder?
                if (is_dir(APPPATH.'controllers/'.$this->directory.$segments))
                {
                        // Set the directory and remove it from the segment array
                        $this->set_directory($this->directory.$segments,$flag);
                        $segments = array_slice($segments, 1);
                        if (count($segments) > 0)
                        {

                              if(is_dir(APPPATH.'controllers/'.$this->directory.$segments))
                              {                        
                                        $this->set_directory($this->directory.$segments,TRUE);
                                        $segments = array_slice($segments, 1);
                                        $this->_validate_request(&$segments,TRUE);
                              }
                        // Does the requested controller exist in the sub-folder?
                              if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments.EXT))
                              {
                                        //echo APPPATH.'controllers/'.$this->fetch_directory().$segments.EXT;
                                        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.EXT))
                              {
                                        $this->directory = '';
                                        return array();
                              }

                        }
      
                        return $segments;
                }
                else
                {
                        if ( file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments.EXT))
                        {
                              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);
      }

经过改造可以实现
http://xx.com/admin/site/notice/detail/1
http://xx.com/admin/site/sys/notice/detail/1
http://xx.com/admin/site/sys/info/notice/detail/1
以及无限级目录的引用请求


大道达人 发表于 2011-9-15 12:32:08

本帖最后由 大道达人 于 2011-9-15 12:42 编辑

测试signature

大道达人 发表于 2011-9-15 12:40:24

本帖最后由 大道达人 于 2011-9-15 12:42 编辑

signature

木木老蔫 发表于 2013-2-21 18:01:05

实测可以使用,不过为啥那么多&符号啊,报错,先生乃骨灰级phper吧

kevin11 发表于 2013-2-21 19:59:31

暂时没有用到,先mark一下
页: [1]
查看完整版本: CI路由的一点改造