版本 4.5.0
发布日期:2024 年 4 月 7 日
CodeIgniter4 的 4.5.0 版本发布
亮点
- 更新最低 PHP 要求至 8.1。 
- 更新最低 PHPUnit 要求至 10.5。 
- CORS 过滤器 (由 kenjis 贡献) 详见 跨域资源共享 (CORS)。 
- 用于在生产环境中提升性能的 spark optimize 命令(由 kenjis 贡献)。 见 spark optimize。 
增强功能
必需过滤器
引入了新的 必需过滤器。这些是特殊的过滤器,它们在其他种类的过滤器之前和之后应用,并且即使路由不存在也总会应用。
以下现有功能已重新实现为必需过滤器。
调试工具栏使用的 Benchmark Timers 现在收集 必需前过滤器 和 必需后过滤器 数据。
基准测试点已经更改:
- 之前: - bootstrap: 创建 Request 和 Response 对象,事件- pre_system,实例化 RouteCollection 对象,加载 Routes 文件,实例化 Router 对象,
- routing: 路由,
 
- 之后: - bootstrap: 创建 Request 和 Response 对象,事件- pre_system。
- required_before_filters: 实例化 Filters 对象,运行 必需前过滤器。
- routing: 实例化 RouteCollection 对象,加载 Routes 文件,实例化 Router 对象,路由,
 
路由
- AutoRouting 改进: 添加了 - $translateUriToCamelCase选项,允许使用驼峰式(CamelCase)控制器和方法名称。详见 URI 转驼峰命名。
- 其他改进:
- 添加了 - $multipleSegmentsOneParam选项。启用该选项时,匹配多个段的占位符(如- (:any))将直接作为一个参数传递,即使它包含多个段。详见 多 URI 段作为单一参数。
- 现在你在 - $override404中设置的 404 控制器方法也会接收到- PageNotFoundException消息作为第一个参数。
- 现在你可以使用 - __invoke()方法作为默认方法。详见 默认方法。
 
 
命令
- 添加了 - spark optimize命令来优化生产环境的配置。详见 spark optimize。
- 添加了 - spark make:test命令来生成测试文件的骨架。详见 make:test。
- 添加了 - spark config:check命令来检查配置值。详见 确认配置值。
- 添加了 - spark phpini:check命令来检查重要的 PHP ini 设置。详见 检查 PHP ini 设置。
- 添加了 - spark lang:find命令来更新翻译键。详见 通过命令生成翻译文件。
- spark db:table命令中已添加- --dbgroup选项。详见 Database Commands。
测试
- DomParser: 添加了新方法 - seeXPath()和- dontSeeXPath(),允许用户使用复杂表达式直接与 DOMXPath 对象交互。
- CLI: 添加了新类 - InputOutput,现在如果你使用- MockInputOutput,可以更轻松地为命令编写测试。详见 使用 MockInputOutput。
- Fabricator: Fabricator 类现在有 - setUnique()、- setOptional()和- setValid()方法,以允许在生成值之前对每个字段调用 Faker 的修饰符。
- TestResponse: TestResponse 不再继承 - PHPUnit\Framework\TestCase,因为它不是一个测试。断言的返回类型现在本地化为- void。
数据库
查询生成器
limit(0) 行为
- 添加了一个功能标志 - Feature::$limitZeroAsAll来修正- limit(0)的错误行为。
- 如果在 SQL 语句中指定了 - LIMIT 0,则返回 0 条记录。然而,查询生成器中存在一个错误,如果指定了- limit(0),生成的 SQL 语句将没有- LIMIT子句,并返回所有记录。
- 建议在 app/Config/Feature.php 中将 - $limitZeroAsAll设置为- false,因为这个错误行为将在未来版本中修复。详见 findAll(0) 行为。
其他
- 支持包含点( - .)的数据库名称。
模型
模型字段转换
添加了一个功能来将从数据库检索到的数据转换为合适的 PHP 类型。详见 模型字段类型转换。
findAll(0) 行为
- 添加了一个功能标志 - Feature::$limitZeroAsAll来修正 Query Builder 的- limit(0)的错误行为。详见 limit(0) 行为。
- 如果你禁用此标志,你需要将 - findAll(0, $offset)更改为- findAll(null, $offset)。
$updateOnlyChanged
添加了一个属性 $updateOnlyChanged,用于决定是否仅更新 Entity 的更改字段。如果你将此属性设置为 false,当你更新一个 Entity 时,即使 Entity 中的值没有变化,也不会抛出 DataException “There is no data to update”。
保存日期
库
- CORS: 添加了 跨域资源共享 (CORS) 过滤器和类。 
- Validation:
- 新增规则 - field_exists,用于检查字段是否存在于要验证的数据中。
- Validation::run()的- $dbGroup参数现在不仅接受数据库组名,还接受数据库连接实例或数据库设置数组。
 
 
- Session:
- RedisHandler现在可以配置获取锁的时间间隔(- $lockRetryInterval)和重试次数(- $lockMaxRetries)。
- 现在你可以在 - RedisHandler中使用 Redis ACL(用户名和密码)。详见 RedisHandler 驱动程序。
 
 
- Security: - Config\Security::$redirect现在是特定于环境的。在生产环境中默认改为- true,但在其他环境中仍然是- false。
其他
- Bootstrap: 引入了 - CodeIgniter\Boot类,取代了 system/bootstrap.php。
- Autoloader:
- 使用 Composer 时的自动加载性能有所提升。在 composer.json 中在 - autoload.psr4设置中添加- App命名空间也可能会提升应用的性能。详见 应用程序命名空间。
- 实现了 FileLocator 缓存。详见 FileLocator 缓存。 
- 添加了 - FileLocatorInterface。
 
 
- CodeIgniter: 新增伪变量 - {memory_usage},在视图文件中显示内存使用情况,这是 CodeIgniter 3 支持的功能。
- Events: 为 Spark 命令添加了事件点 - pre_command和- post_command。详见 Event Points。
- HTTP: 添加了 - Message::addHeader()方法来添加另一个具有相同名称的头。详见- CodeIgniter\HTTP\Message::addHeader()。
- Web 页面缓存: - ResponseCache已改进,包含在缓存键中的请求 HTTP 方法。意味着如果 HTTP 方法不同,相同的 URI 将分别缓存。
- CSP: 添加了 - ContentSecurityPolicy::clearDirective()方法来清除现有的 CSP 指令。详见 清除指令。
重大变更
行为更改
小写 HTTP 方法名
由于历史原因,框架使用小写的 HTTP 方法名,如 “get”、”post”。 但方法令牌是区分大小写的,因为它可能用于具有区分大小写方法名的基于对象的系统。按照惯例,标准化方法用全大写字母 US-ASCII 字母定义。 详见 https://www.rfc-editor.org/rfc/rfc9110#name-overview。
现在框架使用正确的 HTTP 方法名,如 “GET”、”POST”。
- Request::getMethod()返回大写的 HTTP 方法。
- CURLRequest::request()不会将接受的 HTTP 方法更改为大写。
详情见 小写 HTTP 方法名。
过滤器执行顺序
控制器过滤器的执行顺序已更改。详见 升级指南。
嵌套路由组和选项
由于错误修复,行为已更改,使得传递给外部 group() 的选项与内部 group() 的选项合并。
详见 升级指南。
API\ResponseTrait
现在当响应格式为 JSON 时,如果你传递字符串数据,框架将返回 JSON 响应。在以前的版本中,它返回 HTML 响应。 详见 升级指南。
Factories 类
工厂 已更改为最终类(final class)。它是一个静态类,即使它被扩展,也没有替换它的方式。
其他
- AutoRouting Legacy: 如果请求 URI 对应的控制器不存在,则改为抛出 - PageNotFoundException。
- Logger: - log_message()函数和- CodeIgniter\Log\Logger中的 logger 方法现在不再返回- bool值。返回类型已固定为- void,以遵循 PSR-3 接口。
- Autoloader: 已删除 - FileLocator::findQualifiedNameFromPath()返回的完全限定类名中的前缀- \。
- BaseModel: - getIdValue()方法已更改为- abstract。
- system/bootstrap.php: 此文件不能再使用。代码已移动到新类 - CodeIgniter\Boot。
接口更改
备注
只要你没有扩展相关的 CodeIgniter 核心类或实现这些接口,所有这些更改都是向后兼容的,不需要任何干预。
- ResponseInterface: - ResponseInterface::setCookie()的第三个参数- $expire的默认值已从- ''修正为- 0。
- Logger: psr/log 包已升级到 v3.0.0。 
- Validation: - ValidationInterface::run()的方法签名已更改。删除了- $dbGroup参数上的- ?string类型提示。
方法签名更改
FileLocatorInterface
- Router: - RouteCollection构造函数的第一个参数已从- FileLocator更改为- FileLocatorInterface。
- View: - View构造函数的第三个参数已从- FileLocator更改为- FileLocatorInterface。
返回类型更改
- Model: - Model和- BaseModel类中- objectToRawArray()方法的返回类型已从- ?array更改为- array。
传统验证规则
为了在框架代码库中添加 declare(strict_types=1),所有传统验证规则类 CodeIgniter\Validation\FormatRules 和 CodeIgniter\Validation\Rules 中用于验证值的方法参数类型 ?string 已移除。
例如,方法签名更改如下:
之前:public function integer(?string $str = null): bool
之后:public function integer($str = null): bool
其他
- Logger: 实现 PSR-3 接口的 - CodeIgniter\Log\Logger中方法的签名已修正。- bool返回类型已更改为- void。- $message参数现在具有- string|Stringable类型。
- Validation: - Validation::run()的方法签名已更改。去掉了- ?string类型提示。
移除的弃用项
Request
- RequestInterface和- Request中- getMethod()的- $upper参数已移除。详见 小写 HTTP 方法名。
- RequestInterface和- Request中弃用的- isValidIP()方法已移除。
- IncomingRequest中弃用的- $uri和- $config属性的可见性已更改为 protected。
- IncomingRequest中的- $enableCSRF属性已移除。
- IncomingRequest中的- removeRelativeDirectory()方法已移除。
- Request中的- $proxyIPs属性已移除。
Filters
- 已移除以下弃用项,因为现在始终启用 多重过滤器。 - Filters::enableFilter()
- RouteCollection::getFilterForRoute()
- Router::$filterInfo
- Router::getFilter()
 
数据库
- ModelFactory
模型
- BaseModel::idValue()
- BaseModel::fillPlaceholders()
- Model::idValue()
- Model::classToArray()
Response
- ResponseTrait::$CSP属性的可见性已更改为 protected。
- 以下弃用的属性已移除: - ResponseTrait::$CSPEnabled
- ResponseTrait::$cookiePrefix
- ResponseTrait::$cookieDomain
- ResponseTrait::$cookiePath
- ResponseTrait::$cookieSecure
- ResponseTrait::$cookieHTTPOnly
- ResponseTrait::$cookieSameSite
- ResponseTrait::$cookies
 
Security
- SecurityInterface::isExpired()
- Security::isExpired()
- Security::CSRFVerify()
- Security::getCSRFHash()
- Security::getCSRFTokenName()
- Security::sendCookie()
- Security::doSendCookie()
CodeIgniter
- $path
- $useSafeOutput
- useSafeOutput()
- setPath()
测试
- CIDatabaseTestCase
- ControllerResponse
- ControllerTester
- FeatureResponse
- FeatureTestCase
- Mock\MockSecurityConfig
Spark 命令
- migrate:create
- session:migration
其他
- Cache: 已移除 - CodeIgniter\Cache\Exceptions\ExceptionInterface。
- Config:
- 已移除 - CodeIgniter\Config\Config类。
- 已移除 - CodeIgniter\Config\BaseService::discoverServices()方法。
 
 
- Controller: 已移除 - Controller::loadHelpers()方法。
- Exceptions: 已移除 - CodeIgniter\Exceptions\CastException类。
- Entity: 已移除 - CodeIgniter\Entity类。请使用- CodeIgniter\Entity\Entity。
- spark: 已移除 - SPARKED常量。
消息更改
- 添加了 - CLI.generator.className.test消息。
- 添加了 - Validation.field_exists错误消息。
更改
- Bootstrap: .env 的加载和 - ENVIRONMENT的定义已移至 bootstrap.php 之前加载。
- Config:
- Config\Feature::$multipleFilters已移除,因为现在始终启用 多重过滤器。
- 生产环境中的默认错误级别(app/Config/Boot/production.php)已更改为 - E_ALL & ~E_DEPRECATED,以匹配生产环境的默认 php.ini。
 
 
- RouteCollection: 受保护属性 - $routes中的 HTTP 方法键已从小写修正为大写。
- Exceptions: 未使用的 - CodeIgniter\Exceptions\AlertError和- CodeIgniter\Exceptions\EmergencyError已移除。
- Forge: - SQLSRVForge 现在在添加表列时将- ENUM数据类型转换为- VARCHAR(n)。在以前的版本中,它被转换为 SQL Server 中弃用的- TEXT。
- declare(strict_types=1)已添加到大多数框架代码库。
弃用项
- Services: - BaseService::$services属性已弃用,不再使用。
- CodeIgniter:
- determinePath()方法已弃用,不再使用。
- resolvePlatformExtensions()方法已弃用,不再使用。它已被移到- CodeIgniter\Boot::checkMissingExtensions()方法。
- bootstrapEnvironment()方法已弃用,不再使用。它已被移到- CodeIgniter\Boot::loadEnvironmentBootstrap()方法。
- initializeKint()方法已弃用,不再使用。它已移到- Autoloader。
- autoloadKint()方法已弃用,不再使用。它已移到- Autoloader。
- configureKint()方法已弃用,不再使用。它已移到- Autoloader。
 
 
- Response: 构造函数参数 - $config已弃用,不再使用。
- Filters:
- Filters接受- Config\Filters::$methods的小写 HTTP 方法键的功能已弃用。请改用正确的大写 HTTP 方法键。
- spark filter:check命令接受小写 HTTP 方法的功能已弃用。请改用正确的大写 HTTP 方法。
 
 
- RouteCollection: - match()和- setHTTPVerb()方法接受小写 HTTP 方法的功能已弃用。请改用正确的大写 HTTP 方法。
- FeatureTestTrait: - call()和- withRoutes()方法接受小写 HTTP 方法的功能已弃用。请改用正确的大写 HTTP 方法。
- Database: - BaseConnection::$strictOn已弃用,未来将迁移到- MySQLi\Connection。
修复的错误
请参阅仓库中的 CHANGELOG.md 获取完整的错误修复列表。