在codeigniter中使用hmvc时,routes.php文件没有加载?

时间:2012-09-16 11:10:54

标签: php codeigniter routing hmvc codeigniter-routing

我有hmvc设置并正常工作,

我有一个画廊模块。

图库模块分为三个控制器,其结构如下:

/modules/gallery/
/modules/gallery/config/
/modules/gallery/helpers/
/modules/gallery/controllers/
/modules/gallery/controllers/gallery.php
/modules/gallery/controllers/galleries.php
/modules/gallery/controllers/images.php
/modules/gallery/models/
/modules/gallery/models/galleriesmodel.php
/modules/gallery/models/imagesmodel.php
/modules/gallery/views/dashboard.tpl
/modules/gallery/views/galleries/dashboard.tpl
/modules/gallery/views/images/dashboard.tpl

无论如何,我在我的images.php控制器中有一个名为list_items

的函数

所以我想映射网址 http://example.com/gallery/images/list
http://example.com/gallery/images/list_items

所以我想,甜蜜的, 我只想在其中添加/modules/gallery/config/routes.php路径。

但似乎没有包括路线。

包含来自/application/config/routes.php的路由,如果我在模块die('loaded')中放置了routes.php,则确实会杀死该脚本,

但是正在运行

来自其中一个控制器的

print_r($this->router)未显示模块routes.php中的任何路由。

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

据我所知,

HMVC只在每个模块中查找请求的控制器,具有不同的层次结构模型,但是从不读取使用routes.php的模块内的路由覆盖。

查看MX_Router::locate它永远不会在任何模块中查找routes.php

此外,它不会覆盖在{config}文件夹中查找CI_Router::_set_routing的{​​{1}}。

您必须覆盖routes.php并在每个可用模块中阅读CI_Router::_set_routing,以便模块路由覆盖工作。

答案 1 :(得分:0)

Broncha显示方式,我向您展示代码。 我使用此解决方案:

您必须在_set_routing()中修改system/core/Router.php或在MY_Router类(third_party/Router.php)内扩展此方法(更好)。

现在它应该始终加载module/config/routes.php ... (它在第140行附近)

// Load the routes.php file.
        if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
        {
            include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
        }
        elseif (is_file(APPPATH.'config/routes.php'))
        {
            include(APPPATH.'config/routes.php');
        }

        // Include routes every modules
        $modules_locations = config_item('modules_locations') ? config_item('modules_locations') : FALSE;
        if(!$modules_locations)
        {
            $modules_locations = APPPATH . 'modules/';
            if(is_dir($modules_locations))
            {
                $modules_locations = array($modules_locations => '../modules/');
            }
            else
            {
                show_error('Modules directory not found');
            }
        }
        foreach ($modules_locations as $key => $value)
        {
            if ($handle = opendir($key))
            {
                while (false !== ($entry = readdir($handle)))
                {
                    if ($entry != "." && $entry != "..")
                    {
                        if(is_dir($key.$entry))
                        {
                            $rfile = Modules::find('routes'.EXT, $entry, 'config/');
                            if($rfile[0])
                            {
                                include($rfile[0].$rfile[1]);
                            }
                        }
                    }
                }
                closedir($handle);
            }
        } 

        $this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route;
        unset($route);

我希望它会有所帮助...