Расширение модулей 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
и все модели тоже.
4 ответа
Структура модулей
/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
РЕДАКТИРОВАТЬ для поддержки расширений
Файловая структура
Код в 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. Парам работает.
Надеюсь это поможет. Спасибо!!
"Контроллеры" это название определяет его функциональность. Контроллер используется для управления определенным разделом. Поэтому в рамках MVC я думаю, что лучше создать отдельный контроллер для отдельного модуля. Но вы можете повторно использовать модель, т.е. вы можете вызвать функцию одной модели в другой модели. За это
First load your model like $this->load->model("modelName"); in your controller
Then call the function like $this->modelname->functionName();
Если вы загружаете модели в родительский класс или в конструкцию, то это должно быть унаследовано в shop_crud. ты не хочешь делать class Shop_crud extends Core_crud {
? parent::__construct() не сохраняет конструкцию для вас?
Является ли это чем-то, что вы можете обрабатывать с помощью маршрутизации к одному и тому же контроллеру, а не с расширением контроллера (желание наследовать и контроллер, и модель мне кажется странным, или что-то, что вы могли бы обработать с помощью маршрута и закрытой функции в классе для обработки логики)?
Из того, что я могу собрать, вы должны требовать родительского контроллера, который вы расширяете. Это не совсем идеально, но я рассмотрю лучший способ сделать это позже. На данный момент я создал простую функцию для включения.
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, поэтому поместите ее где-нибудь в файл main.php.
Также обратите внимание: поскольку эти переменные используются для ссылки на локальную файловую систему, не назначайте их динамически непосредственно из сгенерированного пользователем ввода. Это может привести к множественным уязвимостям файловой системы.
Платформа: CI3 + Костер 8 HMVC