2013-02-18 111 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('../控制器/方法');