假设我们在控制器中有一个名为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
的所有控制器方法以及所有模型的东西。
答案 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
文件结构
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