codeigniter 3 和 4 均无自动全局事件机制:ci3 仅支持静态钩子,需在 hooks.php 中预定义且依赖 enable_hooks 配置;ci4 的 events::trigger() 必须手动调用,监听器需显式注册,事件为同步阻塞、无默认生命周期事件。

CodeIgniter 本身没有“全局事件触发”机制——CI3 和 CI4 是两套完全不同的设计,别被“事件”这个词带偏了。
CI3 根本没有 Events::trigger(),只有钩子(Hooks)
CI3 的 pre_controller、post_system 这些是静态钩子点,不是事件总线。它不支持运行时动态注册监听器,也不提供 Events::trigger() 或 dispatch_event() 这类方法。所有钩子必须在 application/config/hooks.php 中提前声明,且只在固定生命周期点执行。
-
$config['enable_hooks'] = TRUE必须显式开启,否则整个 hooks 系统静默失效(不报错、不提示) - 钩子文件路径
'filepath' => 'hooks'是相对于APPPATH(即application/),不是项目根目录 - 钩子类中若要访问
$this->session或$this->db,必须用get_instance()获取 CI 实例,不能直接用$this - 钩子配置写错位置(比如塞进
autoload.php)、文件名拼错(hook.php)、缺少defined('BASEPATH')防盗链,都会导致钩子不加载且无日志提示
CI4 的 Events::trigger() 不是“全局自动触发”,而是手动调用
CI4 引入了真正的事件系统,但 Events::trigger() 必须你主动写代码调用,框架不会“自动触发某个全局事件”。它只是个发布接口,不自带预设事件流。
-
Events::trigger('user_logged_in', $user)这种调用必须出现在你的控制器、服务或命令中,不是框架默认行为 - 监听器需通过
Events::on('user_logged_in', function($user) { ... })或配置文件注册,不注册就不会响应 - CI4 的事件监听器默认按注册顺序执行,优先级需手动传
priority参数控制,不设就是 0 - 事件参数传递是“原样转发”,不会自动包装成对象或做类型检查,传错类型或漏参会导致监听器内
TypeError
想实现类似“全局事件”的效果?得自己搭骨架
真要模拟 Laravel 那种“用户登录后自动广播事件”的行为,CI4 可以靠组合策略实现,但每一步都得手写,没捷径。
- 在登录成功逻辑末尾明确加一行
Events::trigger('auth.login.success', $user) - 监听器里别直接写业务(如发邮件),而是调用独立服务类,比如
service('NotificationService')->sendWelcomeEmail($user) - 避免在监听器里做重操作(如 DB 查询、HTTP 请求),CI4 事件是同步阻塞的,卡住就拖慢整个请求
- CI3 用户如果硬要“伪事件”,只能把逻辑塞进
post_controller_constructor钩子,再根据当前路由或方法名做 if 判断——这已经脱离事件本质,变成条件钩子了
最常被忽略的一点:CI4 的事件监听器默认只在当前请求生命周期有效;如果你在命令行(CLI)或队列任务里用事件,得确认 Events 类是否已初始化,否则 trigger() 会静默失败——它不会抛异常,也不会写日志,默认就丢弃。











