CodeIgniter自定义控制器继承结构详解与代码示例
在CodeIgniter项目开发中,为减少重复代码并统一管理权限,通常需要将各功能模块的控制器继承自一个公共的基础控制器。本文将详细说明如何配置并使用 MY_Controller 来实现这一架构。
核心实现原理
CodeIgniter 允许开发者创建自定义的基础控制器。默认情况下,系统会在 application/core/ 目录下查找以 MY_ 开头的文件。只要该类继承了框架核心的 CI_Controller,应用中的其他控制器即可继承这个自定义类,从而复用其中的逻辑。
这种机制常用于需要全局执行的操作,例如:后端管理员的 Session 状态校验、API 接口的 Token 验证、公共数据的初始化加载等。
第1步:检查或修改子类前缀配置
- 目的:确认自定义控制器文件的前缀命名规则。
- 入口:
application/config/config.php - 动作:打开配置文件,找到 $config['subclass_prefix'] 项。默认值通常为
'MY_'。 - 完成状态:确认该值为
My_(注意大小写敏感)或其他期望的字符串,这将决定你在 core 目录新建的文件必须以什么开头。
第2步:创建基础控制器 MY_Controller
- 目的:建立所有自定义控制器的共同父类,注入通用方法。
- 路径:
application/core/MY_Controller.php - 关键参数:类名必须与文件名一致;构造函数需调用 parent::__construct() 以保证 CI 环境正常初始化。
<?php
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
// 在此处添加全局通用的逻辑,例如加载模型、配置变量
}
}
实战应用:后端权限管理
假设我们需要开发一个后台管理系统,要求每个页面都要先判断用户是否已登录。我们可以基于 MY_Controller 再封装一层 AdminBase。
第3步:构建 AdminBase 通用控制器
- 目的:针对后台业务的特定逻辑(如 Session 校验)进行二次封装。
- 路径:
application/core/AdminBase.php(注意:如果只作为业务分层,也可放在application/controllers/admin/AdminBase.php,但需确保其继承了正确的父类且能自动加载,推荐放在 core 下或通过 autoload 管理,此处以 standard 实践展示继承关系)。 - 动作:新建 PHP 文件,继承
MY_Controller,并在构造函数中编写检查逻辑。
<?php
class AdminBase extends MY_Controller
{
public function __construct()
{
parent::__construct();
// 示例:简单的 Session 登录校验
if (!$this->session->userdata('is_admin_logged_in')) {
redirect('login'); // 未登录则跳转至登录页
}
}
}
第4步:具体业务控制器继承 AdminBase
- 目的:实际的业务控制器只需关注自身功能,无需重复编写登录检查代码。
- 路径:
application/controllers/admin/Blog.php - 动作:让 Blog 类继承 AdminBase。
<?php
class Blog extends AdminBase
{
public function __construct()
{
parent::__construct();
// AdminBase 的构造函数会自动执行 Session 校验
// 此处只负责 Blog 特有的初始化
}
public function index()
{
// 业务逻辑... 此时确信用户已登录
}
}
前台结构的同样应用
对于前台公开页面,也可以采用类似的模式创建一个 HomeBase 类来继承 MY_Controller。这有助于区分“需要登录的后台逻辑”和“公开访问的前台逻辑”,使代码结构更加清晰且易于维护。
总结
通过合理利用 MY_Controller 及多层次的继承结构,可以有效解耦 CodeIgniter 项目中的通用逻辑与业务逻辑。这不仅提升了代码的复用率,也让权限管理和环境配置变得更加集中和规范。
以上就是CodeIgniter自定义控制器继承结构与MY_Controller详细内容的介绍,更多关于PHP框架架构优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









