在CodeIgniter中扩展HMVC模块

3
假设我们有一个名为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中所有的控制器方法和模型内容。


有人吗?这应该以某种方式完成 ;( - Derfder
4个回答

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

文件结构

文件结构

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。参数正在工作。

希望这有所帮助。谢谢!


谢谢,但我需要将core_crud控制器和模型中的所有内容都放到shop_crud中。我猜它需要在类Shop_crud extends MX_Controller之前加载。有什么想法吗? - Derfder
哇,谢谢,我会试一下。不过有一个问题。它可以嵌套吗,例如3或4个级别,如:car-module扩展vehicle-modulemercedes-module扩展car-module - Derfder

1
如果您正在父类或构造函数中加载模型,则应该在shop_crud中继承它。您是否不想执行class Shop_crud extends Core_crud {?parent::__construct()没有为您保留构造函数吗?
这是您可以通过路由到同一个控制器来处理的内容,而不是扩展控制器(希望同时继承控制器和模型似乎很奇怪,或者您可以使用路由和类中的私有函数来处理逻辑)。

1

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

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

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

我正在使用 HMVC 而不是传统的 MVC 模式。 - Derfder

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接