3

结构如下所示:

modules
    admin
        controllers/
            admin.php
        models/
            admin_model.php
        views/
            admin/
                index.php
    categories/
        controllers/
            admin.php
            categories.php
        models/
            categories_model.php
        views/
            admin/
                index.php
                menu.php
            frontpage.php
    posts/
        controllers/
            admin.php
            posts.php
        models/
            posts_model.php
        views/
            admin/
                index.php
                menu.php
            frontpage.php    

管理控制器如下所示:

class Admin extends Backend_Controller {

    function __construct()
    {
         parent::__construct();
         $this->load->model('categories_model');
    }

    public function index()
    {
             // index stuff
    }

    public function _menu()
    {
         $this->load->view('categories/admin/menu');
    }

}

当我从另一个模块视图中调用它时,如下所示:

<?php echo Modules::run('categories/admin/_menu'); ?>

它不起作用;(

但是,这有效:

<?php echo Modules::run('categories/categories'); ?>

所以我的问题是如何使用名称admin而不是名称作为模块名称和方法“菜单”加载控制器

知道如何让它在 CodeIgniter 中工作吗?

编辑:

我发现如果我将控制器名称从“admin”更改为其他名称,例如“blablacontroller”,它就会神奇地开始工作。

我已经有另一个名为“admin”的模块,所以这可能是个问题吗?

4

2 回答 2

3

在 PHP 中,您只能使用名称声明一个类。例如。除非这些类位于不同的命名空间中,否则您只能拥有一个 Admin 类。可能发生的是:

admin/controllers/admin.php声明然后稍后在您的脚本执行categories/controllers/admin.php中尝试声明并抛出一个admin/controllers/admin.php已经存在的错误,Admin如果某处的某些代码说它应该使用哪个类new Admin()

如果这两个类都需要,则需要重命名一个类,或者重组代码,以便在单个执行周期中只声明其中一个类。我不太确定您使用的 HMVC 东西是否允许命名空间,但您可以考虑以这种方式扩展它。如果不是,则可能将两个管理类重命名为更具体的名称。

于 2013-04-20T11:52:28.827 回答
3

如果我是对的,您正在使用模块化扩展 - HMVC。所以我的答案基于以下脚本:https ://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/src/868e97533562e910d8263af22750985d57004baa/third_party/MX/Modules.php?at=default 。

这仅在您使用 PHP 5.3 或更高版本时才有效。

  • 通过添加命名空间 admin 来声明一个命名空间(admin、category、post)中的每个 Admin 类在类键之前。
  • 创建 *third_party/MX/Modules.php* 的子类并扩展 run 和 load 方法。如果无法扩展,则必须替换方法:/
  • 这还不是全部,但那些简单的字符串操作应该在现有逻辑之前的加载方法中。
  • 模块应该使用以下语法运行:*Modules::run('categories\admin/_menu');*

    $module = 'categories\admin';
    if (strpos($module, '\\') !== false)
    {
        // Extract namespace
        $ns = explode('\\', $module);
    
        // Get the top level namespace to locate the controller
        $top_level_ns = reset($ns); //
    
        // Remove namespace from module
        $module = array_pop($ns);
    
        // Class location
        $path = APPPATH . $top_level_ns . '/controllers/' . $module;
    
        // It's better to extend the load_file method
        include_once $path . EXT;
    
        // Full class name with namespace, we use explode on $module in case of sub folders
        $controller = '\\' . implode('\\', $ns) . '\\' . ucfirst(end(explode('/', $module))) . CI::$APP->config->item('controller_suffix');
    
        // create and register the new controller
        $alias = strtolower($controller);
        self::$registry[$alias] = new $controller($params);
    
        var_dump('Full class name: ' . $controller, 'Class path: ' . $path);
    }
    
于 2013-04-26T08:35:18.197 回答