web-dev-qa-db-ja.com

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

追記:スクリプトにエラーや警告はありません。コンストラクターを静かに呼び出します。

11
Reed

この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

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を再起動したためですか?

23
Reed

私は同じ問題に遭遇しました。ディレクトリとコントローラの大文字の使用を必ず確認してください。モジュール名とコントローラー名の違いについては、大文字と小文字は区別されません。

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

いくつかの試みの後、どのモジュールにも配置されていないコントローラーを呼び出します。

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

したがって、ドキュメントによると、デフォルトのコントローラーフォルダーにコントローラーをコピーし、モジュールコントローラーに移動すると言われています。

削除された場合、デフォルトのコントローラーファイルから実行するときにモジュールに移動されたコントローラーを実行するにはどうすればよいですか?モジュール内のコントローラーを実行するデフォルトのコントローラーとして実行する方法。

だから私はルートでモジュール名も言及する必要がありますか

0
TaraGurung

私も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); 

これは多くの人にとって明らかかもしれませんが、私は答えを探すのに2時間を無駄にしました。

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