用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3467|回复: 4
收起左侧

[版本 2.x] CI路由的一点改造

[复制链接]
发表于 2011-9-13 18:45:44 | 显示全部楼层 |阅读模式
本帖最后由 大道达人 于 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路由,代码如下
PHP复制代码
 
        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[0].EXT) && $flag === FALSE)
                {
                        return $segments;
                }
 
                // Is the controller in a sub-folder?
                if (is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
                {
                        // Set the directory and remove it from the segment array
                        $this->set_directory($this->directory.$segments[0],$flag);
                        $segments = array_slice($segments, 1);
                        if (count($segments) > 0)
                        {
 
                                if(is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))
                                {                        
                                        $this->set_directory($this->directory.$segments[0],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[0].EXT))
                                {
                                        //echo APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT;
                                        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.EXT))
                                {
                                        $this->directory = '';
                                        return array();
                                }
 
                        }
       
                        return $segments;
                }
                else
                {
                        if ( file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].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[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]);
        }
 
 
复制代码
经过改造可以实现
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
以及无限级目录的引用请求
Router.rar (3.39 KB, 下载次数: 12)

 楼主| 发表于 2011-9-15 12:32:08 | 显示全部楼层
本帖最后由 大道达人 于 2011-9-15 12:42 编辑

测试signature
 楼主| 发表于 2011-9-15 12:40:24 | 显示全部楼层
本帖最后由 大道达人 于 2011-9-15 12:42 编辑

signature

评分

参与人数 1威望 -1 收起 理由
Hex -1 违反版规:回复与主题无关

查看全部评分

发表于 2013-2-21 18:01:05 | 显示全部楼层
实测可以使用,不过为啥那么多&符号啊,报错,先生乃骨灰级phper吧
发表于 2013-2-21 19:59:31 | 显示全部楼层
暂时没有用到,先mark一下

本版积分规则