11

我正在拔掉我所有的头发......一直在搜索每一个线程,如果有人能指出我的工作示例,我将不胜感激。

根据文档: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();

问题:永远不会调用“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

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

4

7 回答 7

23

感谢MC的提示,我终于找到了原因。HMVC 文档确实缺少一些初学者的例子。

对于将来可能会找到此线程的任何人,请在此处正确使用:

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?

于 2013-02-19T15:12:11.663 回答
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

于 2013-02-19T01:15:34.283 回答
2

我遇到了同样的问题。确保检查目录和控制器的大小写。模块和控制器名称之间的区别不区分大小写。

//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
于 2016-04-27T17:55:04.223 回答
1

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

Modules::run('../Controller/method');
于 2016-09-17T03:41:22.063 回答
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); 

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

于 2015-03-28T13:38:22.763 回答
0

所以根据文档,他们说将控制器复制到默认控制器文件夹中并移至模块控制器。

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

那么我是否需要在路线中提及模块名称

于 2015-09-09T06:19:39.680 回答
0
  /*echo Modules::run("controller name of a module which you want to call/and its.. function name");*/

echo Modules::run("Second/callit");

或者

$this->load->module('Second');

$this->second->callit();

但是..控制器名称应该不同..从一个模块到另一个模块..

                       **(parameter passing)**

        echo "<hr>";

       //echo Modules::run("controller name of a module which you want to call/and its.. function name");

         $data="peter";

      echo Modules::run("Second/callit",$data);

      echo "<hr>";

      $this->load->module('Second');

     $this->second->callit($data);

      echo "<hr>";
于 2018-12-19T10:46:35.043 回答