子文件夹中的codeigniter控制器

时间:2012-06-22 09:49:24

标签: php codeigniter routes controllers

我正在设计一个系统,其中uri看起来如下

my-app.com/client-name/admin/foo
my-app.com/client-name/admin/bar

客户名称是可变的。显然,我想将管理控制器放在子文件夹中以保持我的理智。所以我的文件夹看起来如下......

/application/controllers/admin/foo.php
/application/controllers/admin/bar.php

问题:

来自文档: “将控制器组织到子文件夹中 使用此功能时,URI的第一段必须指定文件夹。“

无论如何都要绕过这个?

我可以创建管理控制器吗

/application/controllers/admin.php

使用_remap函数从子文件夹手动加载控制器?

更新

我的路线看起来像这样

// Admin Root
$route['(:any)/admin'] = "admin/welcome";

然后在任何控制器加载之前,我验证第一个URI段以确保客户端存在。

所有客户端都使用相同的控制器和路由。

2 个答案:

答案 0 :(得分:4)

您可以尝试扩展路由方法。像:

<?php

/*
 * Custom router function v 0.1
 *
 * Add functionality : read into more than one sub-folder
 *
 */

Class MY_Router extends CI_Router
{
    Function MY_Router()
    {
        parent::CI_Router();
    }

    function _validate_request($segments)
    {
        if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
        {
            return $segments;
        }

        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            /* ----------- ADDED CODE ------------ */

            while(count($segments) > 0 && 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]);
            $segments = array_slice($segments, 1);
            }

            /* ----------- END ------------ */

            if (count($segments) > 0)
            {
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
                {
                    show_404($this->fetch_directory().$segments[0]);
                }
            }
            else
            {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
                {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        show_404($segments[0]);
    }
}

?>

尽管这种方法可能并不适用于所有人,但从长远来看可能会导致更多问题,但是如果你想因为某种原因分离出你的控制器,那么这是可能的。但是需要做一些相当多的调整才能开始工作。注意:您可能希望通过全新安装执行此操作,并确保这是您想要处理的事情。

我不赞成上面的代码,原始参考可以在这里找到。 http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/

答案 1 :(得分:0)

如果你手动设置你的路线,结果就是这样。

真棒!