在CodeIgniter中扩展HMVC模块

时间:2013-02-25 18:22:14

标签: php codeigniter inheritance module 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
    }

}

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

4 个答案:

答案 0 :(得分:8)

模块的结构

/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

编辑支持EXTENDS

文件结构

File Structure

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。帕拉姆正在工作。

希望这会有所帮助。谢谢!

答案 1 :(得分:1)

如果要在父类或构造中加载模型,那么它应该在shop_crud中继承。你不想做class Shop_crud extends Core_crud {吗?是父_ ::_ construct()没有为你保留构造?

这是否可以通过路由到同一个控制器来处理而不是扩展控制器(想要继承控制器和模型对我来说似乎很奇怪,或者你可以通过类中的路由和私有函数来处理处理逻辑??

答案 2 :(得分:1)

“控制器”这个名称定义了它的功能。控制器用于控制特定部分。所以在MVC框架中我认为最好为单个模块创建单独的控制器。但是您可以重用该模型,即您可以在另一个模型中调用一个模型的函数。对于这个

First load your model like $this->load->model("modelName"); in your controller

Then call the function like $this->modelname->functionName();

答案 3 :(得分:0)

从我可以收集到的内容中,您必须要求您正在扩展的父控制器。这并不完全理想,但我会在以后研究一种更好的方法。目前,我已经创建了一个简单的函数来进行包含。

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