【问题标题】:codeigniter+HMVC cross module call controller->methodcodeigniter+HMVC 跨模块调用控制器->方法
【发布时间】:2013-02-18 23:33:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: php codeigniter hmvc


    【解决方案1】:

    感谢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?

    【讨论】:

    • 谢谢里德。这将有助于初学者。支持:)
    • @MostafaShahverdy 什么不适合你?所有 3 种方法?
    • @Reed,没有一个 :-(
    • 这是一个很棒的解释。可惜我只能竖起一个大拇指。 :)
    • @Reed 如果我在另一个模块中使用相同的控制器名称,并在具有相同名称的控制器中运行该模块的方法,则会引发错误,提示“调用未定义的方法”。
    【解决方案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

    【讨论】:

    • 感谢您的链接!我收到此消息:模块控制器无法运行:ztest2/c2/testc2/
    • 解决了。我已将我的发现放在下面的答案中。我接受了你的回答,因为它帮助我调试了这个东西。不知道 HMVC 只将错误抛出到日志中。谢谢!
    • @Reed,现在我正在使用这个 HMVC 做一个项目,所以我正在学习这个
    • @Reed 接受的答案应该是解决问题的实际答案。
    【解决方案3】:

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

    //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
    

    【讨论】:

      【解决方案4】:

      在尝试调用一个不在任何模块内的控制器之后。

      Modules::run('../Controller/method');
      

      【讨论】:

        【解决方案5】:

        我也是 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); 
        

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

        【讨论】:

          【解决方案6】:

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

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

          所以我还需要在路线中提及模块名称吗

          【讨论】:

            【解决方案7】:
              /*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>";
            

            【讨论】:

              猜你喜欢
              • 2017-04-15
              • 2013-05-06
              • 1970-01-01
              • 2021-10-31
              • 2013-07-02
              • 2016-04-19
              • 1970-01-01
              • 2016-08-05
              相关资源
              最近更新 更多