CodeIgniter 2:如何多次扩展CI_Controller?

时间:2011-10-02 16:24:16

标签: php codeigniter extending-classes

我已经成功扩展了CI_Controller类,创建了一个放在应用程序/核心目录中的MY_Controller.php。

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 /目录中。但我想要两个控制器类,它们不能具有相同的文件名。

5 个答案:

答案 0 :(得分:28)

你只需将它们放在同一个文件中,我有一个与此完全相同的项目。

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

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

编辑:

您甚至不需要给他们MY_Admin_ControllerMY_Controller打电话,我们在Admin_Controller中有User_ControllerAjax_Controller以及MY_Controller文件

答案 1 :(得分:17)

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

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

诀窍是使用__autoload()函数 - Phil在帖子中描述。

答案 2 :(得分:3)

这很简单。执行以下操作:

  1. 转到以下目录:your_ci_app/application/core/并创建一个名为MY_Controller.php的php文件(此文件将位于您的顶级父类所在的位置)
  2. 打开您刚刚创建的文件并添加多个类,如下所示:

    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");
        }
    
    }
    
  3. 在此目录your_ci_app/application/controllers/下创建子控制器。我会称之为adminchild.php

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

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

答案 3 :(得分:1)

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

include 'auth.php';

class test extends Auth

答案 4 :(得分:0)

文件夹 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 />";
    }
}

仪表板有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');
    }
}