Расширение модулей HMVC в CodeIgniter

Допустим, у нас есть модуль под названием core_crud с чем-то вроде этого в контроллере:

 if (!defined('BASEPATH')) exit('No direct script access allowed'); class Core_crud extends MX_Controller { function __construct() { parent::__construct(); $this->load->model('mdl_core_crud'); } public function index() { // code goes here } } 

И теперь я хочу расширить этот модуль еще одним модулем shop_crud . Как бы выглядел базовый контроллер для этого модуля shop_crud ? Я имею в виду, что я хочу наследовать все методы контроллера от core_crud и всей модели.

Структура модулей

 /modules /core_crud /controllers /core_crud.php /models /views /shop_curd /controllers /shop_crud.php /models /views 

Код в core_crud.php

 <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Core_crud extends MX_Controller { function __construct() { parent::__construct(); $this->load->model('mdl_core_crud'); } public function index() { // code goes here } public function mymethod($param1 = '', $param2 = '') { return 'Hello, I am called with paramaters' . $param1 . ' and ' . $param2; } } 

Код в shop_crud.php

 <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Shop_crud extends MX_Controller { public function __construct() { parent::__construct(); //$this->load->model('mdl_shop_curd'); } public function testmethod() { // output directly $this->load->controller('core_crud/mymethod', array('hello', 'world')); // capture the output in variables $myvar = $this->load->controller('core_crud/mymethod', array('hello', 'world'), TRUE); } } 

Поэтому вместо расширения всего модуля / контроллера я предпочитаю просто вызвать требуемый метод. Это просто и легко.

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

module_name/controller_name/mymethod

EDIT для поддержки расширений

Файловая структура

Структура файла

Код в core_crud.php .

 if (!defined('BASEPATH')) exit('No direct script access allowed'); class Core_crud extends MX_Controller { public function __construct() { parent::__construct(); $this->load->model('core_crud/mdl_core_crud'); } public function index() { return 'index'; } public function check_method($param1 = '') { return 'I am from controller core_crud. ' . $this->mdl_core_crud->hello_model() . ' Param is ' . $param1; } } 

Код в mdl_core_crud.php

 if (!defined('BASEPATH')) exit('No direct script access allowed'); class mdl_core_crud extends CI_Model { public function hello_model() { return 'I am from model mdl_core_crud.'; } } 

Код в shop_crud.php .

 if (!defined('BASEPATH')) exit('No direct script access allowed'); include_once APPPATH . '/modules/core_crud/controllers/core_crud.php'; class Shop_crud extends Core_crud { public function __construct() { parent::__construct(); } public function index() { echo parent::check_method('Working.'); } } 

Выход: – Я из контроллера core_crud. Я из модели mdl_core_crud. Параметр работает.

Надеюсь это поможет. Благодаря!!

Если вы загружаете модели в родительский класс или в конструкцию, то он должен быть унаследован в shop_crud. вы не хотите делать class Shop_crud extends Core_crud { ? is parent :: __ construct () не сохраняет конструкцию для вас?

Это то, с чем вы можете справиться с маршрутизацией на один и тот же контроллер, а не с расширением контроллера (желание наследовать как контроллер, так и модель кажется мне странным или что-то, с чем вы могли бы справиться с маршрутом и частной функцией в классе для обработки логики )?

«Контроллеры» это имя определяет его функциональность. Контроллер используется для управления определенным сектором. Поэтому в MVC я считаю, что лучше создать индивидуальный контроллер для отдельного модуля. Но вы можете повторно использовать модель, то есть вы можете назвать функцию одной модели в другой модели. Для этого

 First load your model like $this->load->model("modelName"); in your controller Then call the function like $this->modelname->functionName(); 

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

 function extend_module($module) { $path = realpath(APPPATH) . '/modules/'. $module.'/controllers/'.ucfirst($module).'.php'; require_once($path); } 

Применение:

 extend_module('some_module'); class othe_ module extends some_module { 

ПРИМЕЧАНИЕ. Функция должна быть доступна вне объекта CI, поэтому поместите ее где-то в качестве основного файла index.php.

Также обратите внимание: поскольку эти переменные используются для ссылки на локальную файловую систему, не динамически назначайте их непосредственно из пользовательского ввода. Это может привести к нескольким уязвимостям файловой системы.

Платформа: CI3 + Bonfire 8 HMVC