Arhn - архитектура программирования

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();

Проблема: "метод()" никогда не вызывается. каждый раз вызывается только конструктор контроллера.

Цель состоит в том, чтобы построить автономные 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

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

18.02.2013

Ответы:


1

Этот 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

19.02.2013
  • Спасибо за ссылку! Я получил это сообщение: Не удалось запустить контроллер модуля: ztest2/c2/testc2/ 19.02.2013
  • Это решено. Я изложил свои выводы в ответе ниже. Я принял ваш ответ, потому что он помог мне отладить эту вещь. Не знал, что HMVC бросает ошибку только в журнал. Благодарность! 20.02.2013
  • @Reed, сейчас я работаю над проектом с этим HMVC, поэтому я учусь на этом 20.02.2013
  • @Reed Принятый ответ должен быть фактическим ответом, который решает проблему. 02.04.2017

  • 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?

    19.02.2013
  • Спасибо, Рид. Это поможет новичкам. ПРОГОЛОС :) 20.02.2013
  • @MostafaShahverdy, что у тебя не работает? все 3 способа? 15.09.2013
  • @ Рид, ни один из них :-( 16.09.2013
  • Это потрясающее объяснение. Жаль, что могу поставить только один большой палец вверх. :) 01.11.2013
  • @Reed Если я использую то же имя контроллера в другом модуле и запускаю метод этого модуля в контроллере с таким же именем, он выдает ошибку с сообщением о вызове неопределенного метода. 02.04.2017

  • 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
    
    27.04.2016

    4

    После некоторых попыток добиться вызова контроллера, который не находится ни в одном модуле.

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

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

    Это может быть очевидно для многих из вас, но я потратил два часа на поиски ответа.

    28.03.2015

    6

    поэтому в соответствии с документацией они говорят, что скопируйте контроллер в папку контроллера по умолчанию и перейдите в контроллер модулей.

    Итак, как мне запустить контроллер, который был перемещен в модули, когда я запускаю его работу из файла контроллера по умолчанию, если удаление не работает, так как заставить его запускать контроллер внутри модуля в качестве контроллера по умолчанию для запуска.

    Так что мне нужно также упомянуть имя модуля в маршруте

    09.09.2015

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

    or

    $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>";
    
    19.12.2018
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..