创建一个扩展另一个核心类codeigniter的核心类

时间:2014-02-09 18:24:23

标签: php codeigniter codeigniter-2 codeigniter-3

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的基本控制器?

5 个答案:

答案 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 中的内容。

  1. 启用配置文件中的挂钩(如果尚未挂载)。

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

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

  3. autoload.php 文件夹中创建 application/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; } }); }

  5. 就是这样。

    注意:在这里,我使用了 pre_system 挂钩,而不是 pre_controller ,因为codeigniter会加载 pre_system pre_controller 挂钩之间的基本控制器类。

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

答案 1 :(得分:1)

将user_controller类文件放在MY_Controller.php

的末尾

/ application / core /

中的MY_Controller.php
class 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课程包括在内。问题不在于扩展问题包括文件,所以你必须找到一种方法来包含第二个类。

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