Codeigniter + контроллер перекрестного вызова HMVC-> метод

Я снимаю все свои волосы... Я искал каждую тему, был бы признателен, если бы кто-нибудь мог указать мне на рабочий пример.

Подтверждение документа: 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

дополнительное примечание: нет ошибки или предупреждения с помощью script. Он просто вызывает конструктор.

Ответ 2

Спасибо за подсказку 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?

Ответ 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, и я думал, что у меня такая же проблема. Script казалось, не работает. (без вывода 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("modulename/controller name of module/method or function name");

echo Modules::run("another/Welcome/callit");

Ответ 8

  /*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>";