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_Controller
或MY_Controller
,我们在MY_Controller
文件中有Admin_Controller
和User_Controller
和Ajax_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?的主要内容,如果未能解决你的问题,请参考以下文章