class Settings extends USER_Controller {...}
class USER_Controller extends MY_Controller {...}//limit access to user and define some params and functions that is user depended
class MY_Controller extends CI_Controller {...}//provide extra functionality accross all controllers
如果我尝试创建以上3个类,那么这将无效。
但是,如果我只使用settings extends MY_Controller
,它将正常工作。
那么有没有办法在我的控制器和MY_Controller之间放置一个中间类 - 扩展CI_Controller的基本控制器?
答案 0 :(得分:3)
正如 @Minhaz Ahmed 所说,问题在于加载课程。 Codeigniter只加载具有子类前缀的类,如,
https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php#L276
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
{
require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
}
因此,经过一些挖掘后,我为我的项目使用 codeigniter hooks 和 spl_autoload_register()
提供了一个解决方案,而不会破坏CORE。请按照步骤实现 THE QUESTION 中的内容。
启用配置文件中的挂钩(如果尚未挂载)。
在application / config / hooks.php中创建一个钩子,如下所示。
$hook['pre_system'] = array(
'class' => '',
'function' => 'autoload',
'filename' => 'autoload.php',
'filepath' => 'hooks',
'params' => ''
);
在 autoload.php
文件夹中创建 application/hooks
。
在 autoload.php
文件中,
function autoload()
{
spl_autoload_register(function($class)
{
if(strpos($class,'CI_') !== 0 && file_exists(APPPATH.'core/'.$class.EXT))
{
require_once APPPATH . 'core/' . $class . EXT;
}
});
}
就是这样。
注意:在这里,我使用了 pre_system
挂钩,而不是 pre_controller
,因为codeigniter会加载 pre_system
和 pre_controller
挂钩之间的基本控制器类。
希望这会有所帮助。如果有任何问题请做评论。
答案 1 :(得分:1)
将user_controller类文件放在MY_Controller.php
的末尾 / application / core / 中的MY_Controller.phpclass MY_Controller extends CI_Controller {...}
class USER_Controller extends MY_Controller {...}
现在,从您控制器文件夹中的控制器,您可以从USER_Controller扩展控制器:
class Settings extends USER_Controller {...}
答案 2 :(得分:1)
CI 2.1.4的最佳工作是什么:
应用程序/核心
创造例如:
- base_controller(基本指令,从ci_controller扩展)
- admin_controller(从basecontroller扩展并添加验证指令)
然后在它们中使用它们:application / controllers:
例如:
class users扩展了admin_controller ...
答案 3 :(得分:0)
您可以使用Phil的核心解决方案,简单易用。
http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY
答案 4 :(得分:0)
您可以按照自己的方式扩展课程,但问题是加载课程,您必须将USER_Controller
Settings
课程包括在内。问题不在于扩展问题包括文件,所以你必须找到一种方法来包含第二个类。