2013-02-18 110 views
8

我拉着我的头发......一直在搜索每一个线程,如果有人能指出我的一个工作示例,将不胜感激。codeigniter + HMVC交叉模块呼叫控制器 - >方法

Accroding该文档:https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc 我可以使用

modules::run('module/controller/method', $params); 
modules::load('module/controller/method', $params); 
or 
$this->load->module('module/controller'); 
$this->controller->method(); 

问题调用另一个模块 - >控制器:的 “方法()” 不会被调用。每次只调用控制器的构造函数。

目标是将独立的MVC构建为模块并由其他控制器使用。 但是不管我做什么,它只调用构造函数,方法没有调用。 几周前我开始使用HMVC,我错过了文档中的某些内容,或者它没有用到这种方式?
这里是设置:

modules 
    |--ztest1 
    | |--controller/c1.php 
    |--ztest2 
     |--controller/c2.php 

class C1 extends MX_Controller { 
    function __construct() { 
    parent::__construct(); 
    } 
    function index() { 
    Modules::run('ztest2/c2/testc2/'); 
    //Modules::load('ztest2/c2/testc2/'); 
    //$this->load->module('ztest2/c2/testc2/'); 
    //$this->c2->testc2(); 
    } 
} 

class C2 extends MX_Controller { 
    function __construct() { 
    parent::__construct(); 
    echo __FILE__." // ".__CLASS__."/".__FUNCTION__.PHP_EOL; 
    } 
    function testc2(){ 
    echo __FILE__." // ".__CLASS__."/".__FUNCTION__.PHP_EOL; 
    } 
} 

output: 
/app/modules/ztest2/controllers/c2.php // C2/__construct 

附加说明:没有错误或脚本警告。它只是悄悄地调用构造函数。

回答

2

这HMVC适合我。我正在使用此HMVC正在开发一个项目。 只需编辑third_party/MX/Modules.php,如下面的链接所示,并告诉我回复。

https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/pull-request/5/return-error-messages-instead-of-logging/diff

+0

感谢您的链接!我收到了以下消息:Module controller failed to run:ztest2/c2/testc2/ – Reed 2013-02-19 14:52:27

+0

您的问题解决了吗? – 2013-02-20 09:21:34

+0

它已经解决了。我在下面回答了我的发现。我接受了你的答案,因为它帮助我调试了这件事情。不知道HMVC抛出错误只记录。谢谢! – Reed 2013-02-20 15:32:01

19

感谢MC的提示,我终于想通了原因。 HMVC doc确实缺乏一些初学者的例子。

任何人谁可能在将来发现这个线程,正确的使用方法在这里:

to call module01/controller01/method00: 

//method 1 CORRECT: 
$ctlObj = modules::load('module01/controller01/'); 
$ctlObj->method00(); 
//or you could use chaining: 
modules::load('module01/controller01/')->method00(); 

//method 1 WRONG: 
modules::load('module01/controller01/method00'); //this will only load contructor 

--- 
//method 2 CORRECT: 
modules::run('module01/controller01/method00'); //no trailing slash! 

//method 2 WRONG: 
modules::run('module01/controller01/method00/'); 

--- 
//method 3 CORRECT: 
$this->load->module('module01/controller01'); 
$this->controller01->method00(); 

我不明白,为什么法3次失败,当我第一次尝试...也许是因为我重新启动HTTPD?

+0

谢谢里德。这将有助于初学者。给予好评:) – 2013-02-20 16:10:57

+0

这不是为我工作:-( – 2013-09-15 08:54:04

+0

@MostafaShahverdy究竟是不是为你工作?所有3种方法? – Reed 2013-09-15 18:28:39

0

我也是CI新人,我以为我遇到同样的问题。脚本似乎没有运行。 (没有html输出)。

//This did NOT work (did not produce output) 
modules::run('module_name/method_name',$data); 

// but this DID work??? didn't know why 
modules::run('module_name/method_name',$data); 
exit(); 

// turns out you need the echo for output 
echo modules::run('templates/login_template',$data); 

这对你们许多人来说可能是显而易见的 - 但我浪费了两个小时寻找答案。

0

so根据他们所说的文档,他们说复制控制器在默认控制器文件夹并移动到模块控制器。

那么现在如何运行已经被移动到模块的控制器,当我从默认控制器文件运行它的运行时,如果删除不起作用,那么如何使它运行模块内的控制器作为默认控制器运行。

所以我需要在路由

1

我碰到了同样的问题也提模块名称。确保你检查你的目录和和控制器的大小写。不区分模块和控制器名称。

//In my case the below did not work 
$this->load->module('dashboard/Dashboard'); 
$this->Dashboard->method(); 


//but 
$this->load->module('dashboard'); 
$this->Dashboard->method(); 
//worked 
1

经过一些尝试实现调用不在任何模块内的控制器。

Modules :: run('../控制器/方法');