在CodeIgniter中扩展HMVC模块

Der*_*der 3 php inheritance module codeigniter hmvc

假设我们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
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我想用另一个名为的模块来扩展这个模块shop_crud.该shop_crud模块的基本控制器如何?我的意思是我想继承所有控制器方法core_crud和所有模型的东西.

Mad*_*ota 8

模块的结构

/modules
    /core_crud
        /controllers
            /core_crud.php
        /models
        /views
    /shop_curd
        /controllers
            /shop_crud.php
        /models
        /views
Run Code Online (Sandbox Code Playgroud)

代码 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

代码 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,我不想扩展整个模块/控制器,而只是调用所需的方法.它也很简单.

注意如果模块名称和控制器名称不同,则必须传递路径

module_name/controller_name/mymethod

编辑以支持EXTENDS

文件结构

文件结构

代码在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;
    }

}
Run Code Online (Sandbox Code Playgroud)

代码在 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.';
    }

}
Run Code Online (Sandbox Code Playgroud)

代码在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.');
    }

}
Run Code Online (Sandbox Code Playgroud)

输出: - 我来自控制器core_crud.我来自模特mdl_core_crud.帕拉姆正在工作.

希望这可以帮助.谢谢!!