版本 4.6.0
发布日期:2025 年 1 月 19 日
CodeIgniter4 的 4.6.0 版本发布
重大变更
行为变更
异常处理
异常类已重新设计。详细信息请参阅 异常设计。 以下是相应的破坏性变更:
Validation::setRule()现在抛出CodeIgniter\Exceptions\InvalidArgumentException而非TypeErrorCriticalError现在继承自CodeIgniter\Exceptions\RuntimeException而非ErrorDatabaseException现在继承自CodeIgniter\Exceptions\RuntimeException而非ErrorConfigException现在继承自CodeIgniter\Exceptions\RuntimeException而非CodeIgniter\Exceptions\CriticalErrorTestException现在继承自CodeIgniter\Exceptions\LogicException而非CodeIgniter\Exceptions\CriticalError
过滤器变更
Filters 类已修改,允许在 before 或 after 阶段使用不同参数多次运行相同过滤器。详细信息请参阅 Upgrading Guide。
注册器
新增检查以防止注册器自动发现机制重复运行。若重复执行将抛出异常。详细信息请参阅 注册器的脏数据修复。
Time::createFromTimestamp()
Time::createFromTimestamp() 处理时区的方式已变更。若未显式传递 $timezone 参数,实例时区将设为 UTC(此前使用系统默认时区)。详细信息请参阅 Upgrading Guide。
支持微秒的时间处理
修复了 Time 类中部分方法丢失微秒的缺陷。详细信息请参阅 Upgrade Guide。
Time::setTimestamp()
Time::setTimestamp() 的行为已修正。详细信息请参阅 Upgrade Guide。
非 HTML 请求的错误报告
旧版本中,当请求不接受 HTML 时,CodeIgniter 仅在 development 和 testing 环境下显示错误详情。
由于在自定义环境中无法显示错误详情,现修正此行为:只要 PHP 配置中的 display_errors 启用即显示错误详情。
此修正后,HTML 请求与非 HTML 请求的错误详情显示条件现已统一。
会话 ID (SID)
现在 Session 类库强制使用 PHP 默认的 32 字符 SID(每字符 4 位熵值)。详细信息请参阅 Upgrade Guide。
响应头处理
通过 Response 类设置的响应头将覆盖通过 PHP header() 函数设置的响应头。
旧版本中,Response 类设置的响应头会追加到现有响应头(无法修改),当存在互斥指令的同名响应头时可能导致意外行为。
例如,session 会自动通过 header() 函数设置响应头:
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
若再次设置 Expires 响应头将导致重复:
$response->removeHeader('Expires'); // 无效操作
return $response->setHeader('Expires', 'Sun, 17 Nov 2024 14:17:37 GMT');
响应头结果:
Expires: Thu, 19 Nov 1981 08:52:00 GMT
// ...
Expires: Sun, 17 Nov 2024 14:17:37 GMT
此时浏览器可能无法正确识别有效响应头。本版本变更后,旧响应头将被覆盖:
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Expires: Sun, 17 Nov 2024 14:17:37 GMT
接口变更
备注
只要你未扩展相关 CodeIgniter 核心类或实现这些接口,所有变更均向后兼容且无需调整。
Router: 以下方法已加入
RouteCollectionInterface接口:getDefaultNamespace()getRoutesOptions()setHTTPVerb()isFiltered()getFiltersForRoute()
方法签名变更
Router:
DefinedRouteCollector的构造函数参数类型由RouteCollection改为RouteCollectionInterfaceView:
renderSection()方法的返回类型改为string,且不再调用echoTime:
createFromTimestamp()的首个参数类型由int改为int|float,并新增返回类型staticHelpers: 更新了
character_limiter()的参数命名。若使用命名参数需更新函数调用
移除类型定义
- Database:
移除
BaseConnection::escapeIdentifier()首个参数的string类型移除
BaseConnection::getFieldNames()和SQLite3\Connection::getFieldNames()首个参数的string类型移除
BaseConnection::_listColumns()、MySQLi\Connection::_listColumns()、OCI8\Connection::_listColumns()、Postgre\Connection::_listColumns()、SQLSRV\Connection::_listColumns()、SQLite3\Connection::_listColumns()首个参数的string类型
移除已弃用项
API: 移除
CodeIgniter\API\ResponseTrait中已弃用的failValidationError()方法,改用failValidationErrors()HTTP: 移除
CodeIgniter\HTTP\Response和ResponseInterface中已弃用的getReason()方法,改用getReasonPhrase()Logger: 移除已弃用的
CodeIgniter\Log\Logger::cleanFilenames()和CodeIgniter\Test\TestLogger::cleanup()方法,改用clean_path()函数Router: 移除已弃用的
CodeIgniter\Router\Exceptions\RedirectException异常类,改用CodeIgniter\HTTP\Exceptions\RedirectExceptionConstants: 移除已弃用的
EVENT_PRIORITY_*常量,改用类常量CodeIgniter\Events\Events::PRIORITY_LOW、CodeIgniter\Events\Events::PRIORITY_NORMAL和CodeIgniter\Events\Events::PRIORITY_HIGHView: 移除已弃用的
CodeIgniter\View\View::$currentSection属性Config: 移除已弃用的
Config\Cache::$storePath属性,改用Config\Cache::$file['storePath']Formatter: 移除已弃用的
Config\Format::getFormatter()方法,改用CodeIgniter\Format\Format::getFormatter()Security: 移除
Config\Security::$samesite配置项,改用Config\Cookie::$samesiteCookie: 移除
CodeIgniter\Cookie\CookieStore中的dispatch()、setRawCookie()、setCookie()方法,这些方法已移至CodeIgniter\HTTP\ResponseTrait
功能增强
发布器
Publisher::discover()新增第二个参数(namespace)用于指定搜索发布器的命名空间。详细信息请参阅 在指定命名空间中发现。
异常处理
异常类已重新设计。详细信息请参阅 异常设计。 新增以下异常类:
CodeIgniter\Exceptions\LogicExceptionCodeIgniter\Exceptions\RuntimeExceptionCodeIgniter\Exceptions\BadFunctionCallExceptionCodeIgniter\Exceptions\BadMethodCallExceptionCodeIgniter\Exceptions\InvalidArgumentException
新增以下异常接口:
CodeIgniter\Files\Exceptions\ExceptionInterfaceCodeIgniter\HTTP\Exceptions\ExceptionInterfaceCodeIgniter\Router\Exceptions\ExceptionInterface
非 HTML 响应的异常显示现基于 PHP 的 display_errors 设置,而非硬编码环境判断。
命令行工具
spark routes和spark filter:check命令现显示过滤器参数spark filter:check命令现显示过滤器类名新增
spark lang:sync命令用于同步翻译文件。详细信息请参阅 通过命令同步翻译文件spark phpini:check命令新增可选opcache参数,用于显示 opcache 设置信息
路由
现可在限制路由时指定多个主机名
协商器
新增特性开关
Feature::$strictLocaleNegotiation用于启用严格区域匹配。 旧版本中,对于Accept-language: en-US,en-GB;q=0.9的请求会返回首个允许的语言en(而非精确匹配en-US或en-GB)。 设为true后启用基于语言代码(’en’ - ISO 639-1)和区域代码(’en-US’ - ISO 639-1 + ISO 3166-1 alpha)的精确匹配。
分页
新增获取当前页总条目数和范围的功能。 详细信息请参阅 显示条目数。
数据库
其他改进
为 MySQLi 新增
foundRows配置项以使用MYSQLI_CLIENT_FOUND_ROWS新增
BaseConnection::resetTransStatus()方法用于重置事务状态。详细信息请参阅 重置事务状态SQLite3 新增
synchronous配置项,用于调整事务期间磁盘刷写策略。结合WAL日志模式时可有效优化性能
类库
File:
File类新增getSizeByBinaryUnit()和getSizeByMetricUnit()方法。 详细信息请参阅 File::getSizeByBinaryUnit() 和 File::getSizeByMetricUnit()。FileCollection:
FileCollection类新增retainMultiplePatterns()方法。 详细信息请参阅 FileCollection::retainMultiplePatterns()。Validation:
FileRules类新增min_dims验证规则。 详细信息请参阅 Validation。Validation:
is_unique和is_not_unique规则现允许在首个参数中指定dbGroup。 详细信息请参阅 Validation。
其他
Filters: 现可在 before 或 after 阶段使用不同参数多次执行同一过滤器
Services: 新增
BaseService::resetServicesCache()方法用于重置服务缓存。 详细信息请参阅 重置服务缓存Errors: 新增默认的 “400 Bad Request” 错误页面
消息变更
新增
Validation.min_dims消息新增
Errors.badRequest和Errors.sorryBadRequest消息
变更列表
异常处理
异常类已重新设计。详细信息请参阅 异常设计。 以下是相应变更:
缓存处理器类的
deleteMatching()方法现抛出CodeIgniter\Exceptions\BadMethodCallException而非ExceptionCache\ResponseCache::get()现抛出CodeIgniter\Exceptions\RuntimeException而非Exception原抛出
RuntimeException的类现改为抛出CodeIgniter\Exceptions\RuntimeException原抛出
InvalidArgumentException的类现改为抛出CodeIgniter\Exceptions\InvalidArgumentException原抛出
LogicException的类现改为抛出CodeIgniter\Exceptions\LogicException原抛出
BadMethodCallException的类现改为抛出CodeIgniter\Exceptions\BadMethodCallException原抛出
BadFunctionCallException的类现改为抛出CodeIgniter\Exceptions\BadFunctionCallExceptionRedirectException现继承自CodeIgniter\Exceptions\RuntimeException而非ExceptionPageNotFoundException现继承自CodeIgniter\Exceptions\RuntimeException而非OutOfBoundsException
已弃用项
- Filters:
弃用
Filters的$arguments和$argumentsClass属性(不再使用)弃用
Filters::getArguments()方法(不再使用)
- File:
弃用
File的getSizeByUnit()方法,改用getSizeByBinaryUnit()或getSizeByMetricUnit()
已修复的 Bug
- Response:
现在通过
Response类设置的响应头将优先覆盖通过 PHPheader()函数手动设置的响应头
View: 为
View::excerpt()新增多字节字符串支持Helpers: 为
excerpt()新增多字节字符串支持
完整缺陷修复列表请查阅仓库的 CHANGELOG.md。