CodeIgniter 2:如何多次扩展 CI_Controller?

Posted

技术标签:

【中文标题】CodeIgniter 2:如何多次扩展 CI_Controller?【英文标题】:CodeIgniter 2: How to extend CI_Controller multiple times? 【发布时间】:2011-11-29 11:11:42 【问题描述】:

我已经通过创建一个放在 application/core 目录中的 MY_Controller.php 成功地扩展了 CI_Controller 类。

core/My_Controller.php 看起来像这样:

class MY_Controller extends CI_Controller 

    function __construct()
    
        parent::__construct();
    

然后,当我创建普通控制器时,它们看起来像这样:

class Home extends MY_Controller 

    function __construct()
    
        parent::__construct();
    

    function index()
    
        $this->load->view('home');
    

我正在创建一个管理后端,我希望有一个不同的基类供控制器扩展,而不是 My_Controller。这样我就可以有管理控制器的常用方法(即 authentication_check 等)

我无法解决的是如何创建另一个扩展 CI_Controller 的控制器。

目标是让管理控制器扩展与前端控制器不同的基类。

管理基本控制器如下所示:

class MY_Admin_Controller extends CI_Controller 

    function __construct()
    
        parent::__construct();
    

管理页面的普通控制器:

class Admin_home extends MY_Admin_Controller 

    function __construct()
    
        parent::__construct();
    

    function index()
    
        $this->load->view('admin_home');
    

问题在于,要扩展 CI_Controller 类,您必须将控制器文件命名为 PREFIX_Controller.php 并将其放在 core/ 目录中。但我想要两个控制器类,它们不能有相同的文件名。

【问题讨论】:

请原谅这个问题,但是您究竟为什么要这样做呢?你有什么特别想实现的目标吗? 【参考方案1】:

你只是把两者放在同一个文件中,我有一个和这个完全一样的项目。

我们在MY_Controller.php 文件中只有管理员和普通扩展控制器,工作正常。

MY_Controller 或其他扩展文件的主要原因是 CodeIgniter 在您加载基本文件(无论是库、帮助程序等)时自动启动它们,您可以在这些文件中包含许多类。

编辑:

您甚至不需要称呼他们为MY_Admin_ControllerMY_Controller,我们在MY_Controller 文件中有Admin_ControllerUser_ControllerAjax_Controller

【讨论】:

但这会严重污染框架,并且违背了他们更清洁编码和架构的目的......闻起来很糟糕。 我不确定我在论坛上的什么地方读到的,但是当我第一次开始使用 CodeIgniter 时建议这样做,如果建议的方法发生了变化,请告诉我 它没有弄脏框架,而是利用了它的包含/加载机制。作为替代方案,您可以提供自己的自动加载器,然后在其中放置一个空白文件。 @DamienPirsy 你能解释一下为什么你认为这很糟糕吗?这不是面向对象的全部意义吗?如果有我所有的视图控制器都需要的通用代码,为什么不将该代码放在一个超类中并扩展它呢? @Camsoft,恕我直言,解决方案的问题是您在一个文件中有 2 个控制器,因此对于外人来说系统如何工作变得不那么明显了。 Swatkin 的解决方案对我来说似乎更好:)【参考方案2】:

你所做的是正确的。您只需要application/core 目录中的所有这些文件。这是 Phil Sturgeon 的一篇关于这个的帖子:

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

诀窍是使用 __autoload() 函数 - Phil 在他的帖子中进行了描述。

【讨论】:

如果您使用链接示例,请记住@ 错误抑制也会抑制类文件中的语法错误导致静默失败。【参考方案3】:

这很容易。执行以下操作:

    转到以下目录:your_ci_app/application/core/ 并创建一个名为 MY_Controller.php 的 php 文件(该文件将是您的***父类所在的位置)

    打开您刚刚创建的文件并添加多个类,如下所示:

    class Admin_Parent extends CI_Controller 
        public function __construct() 
            parent::__construct();
        
    
        public function test() 
            var_dump("from Admin_Parent");
        
    
    
    class User_Parent extends CI_Controller 
    
        public function __construct() 
            parent::__construct();
        
    
        public function test()
            var_dump("from User_Parent");
        
    
    
    

    在此目录 your_ci_app/application/controllers/ 下创建您的子控制器。我会叫它adminchild.php

    打开adminchild.php 并创建您的控制器代码,确保扩展父类的名称,如下所示:

    class Adminchild extends Admin_Parent 
    
        function __construct() 
            parent::__construct();
        
    
        function test() 
            parent::test();
        
    
    
    

【讨论】:

【参考方案4】:

如果你想扩展另一个类而不是 CI_controller,你必须包含目标类。例如

include 'auth.php';

class test extends Auth

【讨论】:

【参考方案5】:

application/core文件夹中的所有文件


MY 是 CI 的子类 我有 2 个子类 Public 和 Dashboard
class MY_Controller extends CI_Controller

    public function __construct()
    
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    

公开

class Public_Controller extends My_Controller

    public function __construct()
    
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    

Dashboard 有 2 个子类,Admin 和 User

class Dashboard_Controller extends My_Controller

    public function __construct()
    
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    

管理员

class Admin_Controller extends Dashboard_Controller

    public function __construct()
    
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    

用户

class User_Controller extends Dashboard_Controller

    public function __construct()
    
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    

config/config.php

/* load class in core folder */
function my_load($class)         
    if (strpos($class, 'CI_') !== 0)             
        if (is_readable(APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php' ))                 
            require_once (APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php');                
        
            


spl_autoload_register('my_load');

controller/Home.php

//class Home extends MY_Controller 
//class Home extends Dashboard_Controller 
class Home extends Admin_Controller 

    public function index()
    
        echo "This is " . __CLASS__ . "<br />";
        //$this->load->view('home');
    

【讨论】:

以上是关于CodeIgniter 2:如何多次扩展 CI_Controller?的主要内容,如果未能解决你的问题,请参考以下文章

如何扩展 CodeIgniter 数据库实用程序类

在 CodeIgniter 3 中多次渲染视图

如何使 CodeIgniter 文件上传类接受所有扩展?

如何在 Codeigniter 4 中扩展控制器?

如何通过 CodeIgniter 连接 MongoDB

MYSQL在codeigniter中多次插入[重复]