CodeIgniter 2:如何扩展CI_Controller多次



我通过创建MY_Controller.php成功地扩展了CI_Controller类,并将其放置在application/core目录中。

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

您只是将两者放在同一个文件中,我有一个与此完全相同的项目。

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

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

编辑:

你甚至不需要称它们为MY_Admin_ControllerMY_Controller,我们在MY_Controller文件中有Admin_ControllerUser_ControllerAjax_Controller

你做的是对的。您只需要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在他的帖子中描述过。

这很简单。

  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();
        }
    }
    

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

include 'auth.php';
class test extends Auth

文件夹application/core


中的所有文件MY是子类CI
我有两个子类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。

/* 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');

控制器/home。

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

相关内容

  • 没有找到相关文章

最新更新