CodeIgniter钩子最常用且实用的事件是pre_controller、post_controller_constructor、post_controller、display_override和cache_override,分别用于权限校验、上下文初始化、响应审计、输出压缩及自定义缓存接管,需按职责拆分文件并严格配置路径与时机。

CodeIgniter 的钩子(Hooks)不是“插件”或“中间件”,而是一套嵌入框架生命周期的轻量级事件拦截机制。它不依赖外部包,原生支持,适合做全局性、非侵入式的逻辑注入——比如统一鉴权、请求日志、输出压缩、多语言切换前处理等。用得好,能大幅减少控制器里重复代码;用得乱,反而让流程难以追踪。关键在选对时机、控好范围、保持轻量。
哪些钩子事件最常用、最实用
CodeIgniter 预定义了约 10 个执行点,但日常开发中高频使用的其实就 4–5 个:
- pre_controller:控制器加载前触发。适合做登录态校验、权限拦截、路由预处理(如 URL 重写、多租户识别)。
-
post_controller_constructor:控制器对象已创建、构造函数执行完毕后触发。此时可安全访问
$this->session、$this->db等核心服务,适合做上下文初始化(如设置当前用户、加载通用配置)。 - post_controller:控制器方法执行完、视图尚未渲染时触发。适合做响应数据审计、API 返回体统一封装、异常兜底处理。
- display_override:视图输出前最后一道关卡。可用于模板缓存、HTML 压缩、SEO 标签注入、水印添加等输出层操作。
- cache_override:当启用缓存且命中时跳过默认输出逻辑,完全由你接管缓存读写。适合对接 Redis 或文件级自定义缓存策略。
钩子文件怎么组织才清晰可控
别把所有钩子塞进一个类里。按职责拆分,每个钩子对应独立文件,命名体现用途,例如:
-
AuthHook.php→ 处理pre_controller权限检查 -
LogRequestHook.php→ 在post_controller记录请求耗时与状态码 -
OutputCompressHook.php→ 用display_override对 HTML 进行 gzip 前压缩
所有文件统一放在 application/hooks/ 下,类名与文件名严格一致(如 class AuthHook),方法必须是 public 且无参数(参数通过 params 数组传入)。钩子类内部可通过 get_instance() 获取 CI 实例,调用任意加载的服务,例如:$ci =& get_instance(); $ci->load->library('session');
配置钩子时容易踩的坑
钩子配置写在 application/config/hooks.php,常见错误包括:
- 忘记开启全局开关:
$config['enable_hooks'] = TRUE;(在config.php中) - 路径写错:filepath 是相对于
application/的,不是项目根目录,'filepath' => 'hooks'即表示application/hooks/ - 多个同名钩子未用数组追加:若需绑定多个
pre_controller钩子,必须用$hook['pre_controller'][] = [...],否则后定义的会覆盖前一个 - 类方法调用时机不当:比如在
pre_system里尝试访问$this->db,此时数据库类还没加载,会报错
和 CI4 的过滤器(Filters)怎么选
CI4 引入了更现代的 Filters 机制,支持基于 HTTP 方法、URI 模式匹配、前置/后置执行,语义更明确、调试更直观。但钩子仍有不可替代场景:
- 需要在
pre_system或cache_override这类 CI4 Filters 不覆盖的节点执行逻辑 - 维护 CI3 项目,或混合使用 CI3/CI4 的遗留系统
- 想绕过路由层直接干预底层输出(比如修改原始 HTTP header、接管整个响应流)
新项目建议优先用 Filters;老项目升级或需深度控制底层流程时,钩子仍是可靠选择。


















