Расширение модулей 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

Другие вопросы по тегам