1

我正在设计一个系统,其中 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 段以确保客户端存在。

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

4

2 回答 2

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/

于 2012-06-22T09:57:31.933 回答
0

事实证明,如果您手动设置路线,这将有效。

惊人的!

于 2012-06-22T11:02:56.200 回答