2014-02-09 186 views
0
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级以上的这不会工作。创建一个核心类,扩展另一个核心类codeigniter

但如果我只是使用​​它会正常工作。

那么有没有办法可以在我的控制器和MY_Controller之间放置一个中间类 - 扩展CI_Controller的基础控制器?

+0

你是如何扩展核心类的?你使用了不同的文件吗? –

+0

即使标记为重复,这里所接受的解决方案也远远优于“原始”问题中提出的所有其他解决方案。 – Chococroc

回答

3

由于@Minhaz艾哈迈德说,问题是加载类。笨只加载与子类前缀的类,

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'; 
} 

一些矿区后,所以我用我的项目都笨钩spl_​autoload_​register()没有黑客的解决方案来核心。请按照步骤完成问题中的内容。

  1. 如果配置文件尚未挂钩,则启用挂钩。

  2. 在application/config/hooks.php中创建一个钩子,如下所示。

    $hook['pre_system'] = array( 'class' => '', 'function' => 'autoload', 'filename' => 'autoload.php', 'filepath' => 'hooks', 'params' => '' );

  3. 创建autoload.phpapplication/hooks文件夹。

  4. 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,因为笨加载pre_systempre_controller钩之间的基本控制器类。

希望这会有所帮助。如果有任何问题,请发表评论。

+0

不错的代码,谢谢分享 – Zalaboza

+0

你在CI 3.0.3中试过了吗?它在CI 3.0.3中不起作用 – Abaij

+0

没有人..对不起..我与CI没有联系..感动了Laravel;) – IJas

0

您可以使用菲尔的核心解决方案,它的简单和容易。

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

+0

Whith Phil解决方案,您只能定义一个自动加载。检查http://php.net//manual/en/function.spl-autoload-register.php – Chococroc

+0

如果你想要另一个核心类,你可以扩展所有的类。所以基于这个基于对象的思想基础? –

+0

是的,问题不在于扩展它,问题在于如果您的PHP文件没有通过include/require直接包含在您的代码中,您的PHP文件如何找到这些类。 __autoload定义了如何去做,但是使用spl_autoload_register你可以定义多个函数,以防它找不到自己的代码,也不包括 – Chococroc

1

发生在MY_Controller.php

MY_Controller.php在/应用/芯端的user_controller类文件/

class MY_Controller extends CI_Controller {...} 
class USER_Controller extends MY_Controller {...} 

现在从您的控制器在控制器中的文件夹,您可以从USER_Controller扩展控制器:

class Settings extends USER_Controller {...} 
0

您可以按照自己想要的方式扩展班级,但问题在于班级正在加载,您必须包含您的Settings班级的USER_Controller。问题不是扩展问题是包含文件,所以你必须找到一种方法来包含第二类。

http://www.php.net/manual/en/function.spl-autoload.php

1

什么做的最好的工作为CI 2.1.4:
应用/核心

创建例如:
- base_controller(基本指令,由是CI_Controller延伸)
- admin_controller (从基础控制器扩展并添加认证指令)


然后使用t下摆在:应用程序/控制器:
例如:
类用户扩展admin_controller ...