介绍一下近期发布的 CodeIgniter 4.7 版。本次更新包含了一些底层架构变动和对新 PHP 特性的跟进。
核心改动与新特性
- 强制 PHP 8.2:运行环境的最低要求正式提高到了 PHP 8.2。
- Worker 模式 (实验性):支持 FrankenPHP Worker 模式,让长效运行的进程成为可能,以提升性能。官方配套给了
php spark worker:install和worker:uninstall命令,底层也加了Boot::bootWorker()等相关的清理与重置方法。 - Signals 机制:新增了基于
SignalTrait的事件驱动架构,用于组件间的通信。 - 控制器注解:现在可以用 PHP 8+ 的注解特性来写控制器。
- API Transformer:自带了结构化的转换器,可以在返回 API 响应前先格式化数据。
数据库与模型改动
- 支持枚举:模型和实体类现在可以用
EnumCast原生处理 PHP 枚举类型了。 - 主键验证前置:模型会在执行数据库查询前先校验主键,一旦出错直接抛出
InvalidArgumentException,不再等数据库返回错误。 - 批处理更守规矩:
insertBatch()和updateBatch()现在会老老实实遵循模型的验证规则以及updateOnlyChanged设置。 - 实体深度追踪:实体类现在能追踪嵌套对象和数组的变更,并支持正确的 JSON 序列化。
toRawArray()处理包含实体类的数组时也能正确转换了。 - 连接检测:
BaseConnection新增了ping()方法来检测数据库死活,reconnect()在重连前也会先 ping 一下。所有数据库驱动的异常日志记录也统一了标准。QueryInterface加了getOriginalQuery()方法,BaseModel和Model的类型提示也补全了。
缓存系统重构
- 整个缓存系统加上了原生的类型声明。
CacheInterface接口加了两个新方法:remember()用来实现 cache-aside 模式,deleteMatching()用来批量删缓存。- 针对单服务器环境,加了一个高并发的 APCu 缓存驱动。
- Redis 缓存多了
async和persistent配置项,Redis 的 Session 处理器也支持了persistent长连接。 PageCache现在可以通过Config\Cache::$cacheStatusCodes过滤特定的 HTTP 状态码来决定缓存策略。
安全与系统增强
- CSP3 支持:支持内容安全策略 Level 3,包含
script-src-elem、report-to指令,并支持 SHA-256/384/512 哈希。 - 密钥平滑轮换:通过配置
Config\Encryption::$previousKeys可以轮换加密密钥,且旧数据依然能解密。 - 迁移锁:在分布式环境跑数据库迁移时,可以通过
Config\Migrations::$lock开启锁机制防止并发冲突。 - 敏感参数打码:处理密码等敏感数据的方法加上了 PHP 的
SensitiveParameter属性,防止在堆栈跟踪中泄漏。 - 视图覆盖:把视图文件放到
app/Views/overrides目录下,就能直接覆盖框架自带的命名空间视图。 - HTTP 优化:
CURLRequest支持共享 DNS 缓存和连接了,也加了全新的连接和 DNS 缓存超时配置。Cookie 的过期时间格式改成了符合 RFC 7231 的规范。
需要修改代码的破坏性变更
升级前,请对照检查你的项目逻辑:
- 验证规则:
regex_match的占位符强制要求用双大括号,也就是得写成{{placeholder}}。 - 接口变动:如果你自己实现了
CacheInterface、QueryInterface或ImageHandlerInterface,必须补充上面提到的新方法(比如deleteMatching()、getOriginalQuery()、clearMetadata())。 - 实体变化:
$dataCaster属性现在允许为 null 了。前面提到的深层追踪功能,可能会导致依赖浅层对比的老代码出现问题。 - 返回类型:框架移除了
#[ReturnTypeWillChange],全面要求写死原生的返回类型。 - 加密参数:通过
$params传进去的密钥,不会再直接修改处理器内部的$key属性了。Cookie 相关的SAMESITE_*常量全改成了首字母大写风格,并且值也做了标准化处理。
被移除的旧方法
BaseModel::transformDataRowToArray()。Entity::setAttributes()(官方建议改用injectRawData())。- Session 的部分属性以及
stop()方法。 - 文本辅助函数的
random_string()去掉了basic、md5和sha1这三种类型。 - 删除了部分过时的
IncomingRequest检测方法。
其他细节改动
- 图片处理:ImageMagick 处理器推倒重写,现在纯依赖 PHP 的
imagick扩展,并新增了clearMetadata()方法用来抹除图片的隐私元数据。 - 时间辅助函数:补上了
addCalendarMonths()、subCalendarMonths()、isPast()和isFuture()。 - 环境配置:可以通过
Paths::$envDirectory指定.env文件存放的路径了。 - 数据处理:可以通过
Config\Format::$jsonEncodeDepth来控制json_encode的最大深度。 - 网络与爬虫:更新了 User Agent 里的 robots 列表,覆盖了新出的搜索引擎爬虫。SMTP 发信支持通过
Config\Email::$SMTPAuthMethod指定授权方式。 - 调试工具栏:修复了遇到 HTMX、Turbo 等 AJAX 请求时导致崩溃的问题,并且能更聪明地识别二进制或流式响应。Memcached Session 处理器现在也支持数据库连接持久化了。
中文手册已更新到 4.7
中文手册已更新到 4.7.2,并对手册进行了全面的重新翻译,为大家提供更好的阅读体验,点击这里查看。