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 个类,这将不起作用。

但是,如果我只是使用settings extends MY_Controller它会很好。

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

4

5 回答 5

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 钩子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.phpinapplication/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_systemhook,而不是pre_controller,因为 codeigniter 在pre_systempre_controllerhooks 之间加载了基本控制器类。

希望这可以帮助。如果对此有任何问题,请发表评论。

于 2014-03-02T08:28:24.780 回答
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 {...}
于 2014-02-10T10:41:01.177 回答
1

CI 2.1.4 的最佳工作是什么:
应用程序/核心

创建例如:
- base_controller(基本指令,从 ci_controller 扩展)
- admin_controller(从基本控制器扩展并添加身份验证指令)


然后将它们用于:应用程序/控制器:
例如:
类用户扩展了 admin_controller...

于 2014-02-15T20:10:25.347 回答
0

您可以使用 Phil 的核心解决方案,它简单易行。

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

于 2014-02-09T19:08:08.670 回答
0

您可以按照您想要的方式扩展类,但问题是加载类,您必须包含您USER_ControllerSettings类。问题不是扩展问题是包含文件,所以你必须找到一种方法来包含第二个类。

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

于 2014-02-13T20:45:35.700 回答