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和所有模型的东西。

4

4 回答 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

编辑以支持扩展

文件结构

文件结构

中的代码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。参数正在工作。

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

于 2013-02-28T05:00:26.550 回答
1

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

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

于 2013-02-27T19:30:13.483 回答
1

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

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

Then call the function like $this->modelname->functionName();
于 2013-03-02T12:25:24.707 回答
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

于 2015-12-03T16:26:09.967 回答