我通过创建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_Controller
或MY_Controller
,我们在MY_Controller
文件中有Admin_Controller
、User_Controller
和Ajax_Controller
你做的是对的。您只需要application/core
目录下的所有这些文件。这是Phil Sturgeon关于这个的一篇文章:
http://philsturgeon.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY/
技巧是使用__autoload()
函数- Phil在他的帖子中描述过。
这很简单。
- 进入以下目录:
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(); } }
如果您想要扩展另一个类而不是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');
}
}