版本 4.3.0
发布日期:2023 年 1 月 10 日
CodeIgniter 4.3.0 版发布
亮点
查询构建器支持 upsert()、upsertBatch()、deleteBatch(), 现在 *batch() 方法可以从查询中设置数据 (由 sclubricants 贡献)。 详情请参阅 查询构建器。
数据库 Forge 支持在 现有表中添加索引 和 命名索引 (由 sclubricants 贡献)。 详情请参阅 Forge。
为了使默认配置更安全,默认验证规则 已更改为 严格规则。
当数据库错误发生时,会抛出异常的条件和 可以抛出的异常类已发生变化。 请参阅 数据库错误时抛出的异常。
不兼容变更
行为变化
数据库错误时抛出的异常
数据库连接类抛出的异常已更改为
CodeIgniter\Database\Exceptions\DatabaseException。以前,不同的数据库驱动程序会抛出不同的异常类,但这些已经统一为DatabaseException。准备好的查询的
execute()方法抛出的异常已更改为DatabaseException。以前,不同的数据库驱动程序可能会抛出不同的异常类,或者不抛出异常,但这些已统一为DatabaseException。在事务期间,即使
DBDebug为 true,默认情况下也不会抛出异常。DBDebug和CI_DEBUG变化为了在不同环境下保持一致的行为,
Config\Database::$default['DBDebug']和Config\Database::$tests['DBDebug']默认更改为true。通过这些 设置,当数据库错误发生时,总是会抛出异常。以前,在生产环境中默认为false。现在,如果
$DBDebug为 true,则在BaseBuilder中抛出的DatabaseException会被抛出。 以前,如果CI_DEBUG为 true 则会抛出。BaseConnection::$DBDebug的默认值已更改为true。通过这些更改,
DBDebug现在表示数据库错误发生时是否抛出异常。 虽然与调试无关,但名称未更改。当
DBDebug为true运行事务时,即使查询错误也不会抛出异常。以前,如果发生查询错误, 所有查询都会回滚,并抛出异常,因此 错误处理 或 手动运行事务 不起作用。现在,在
Model中删除没有 WHERE 子句时,即使CI_DEBUG为 false 也会抛出DatabaseException。以前,如果CI_DEBUG为 true 则会抛出。
异常发生时的 HTTP 状态码和退出代码
以前,CodeIgniter 的异常处理程序在某些情况下会使用 异常代码 作为 HTTP 状态码,并根据异常代码计算 退出代码。但是异常代码与 HTTP 状态码或退出代码之间不应该有逻辑联系。
现在,异常处理程序默认将 HTTP 状态码设置为
500,并将退出代码设置为常量EXIT_ERROR(=1)。你可以在异常类中实现
HTTPExceptionInterface或HasExitCodeInterface来更改 HTTP 状态码或退出代码。请参阅 在异常中指定 HTTP 状态码 和 在异常中指定退出码。
例如,退出代码已发生如下更改:
如果发生未捕获的
ConfigException,退出代码将是EXIT_CONFIG(=3),而不是12。如果发生未捕获的
CastException,退出代码将是EXIT_CONFIG(=3),而不是9。如果发生未捕获的
DatabaseException,退出代码将是EXIT_DATABASE(=8),而不是17。
时间
时间 类的以下方法存在会更改当前对象状态的错误。为了修复这些错误,时间类已被修复:
add()
modify()
setDate()
setISODate()
setTime()
sub()
现在
Time类扩展DateTimeImmutable并完全是不可变的。添加了
TimeLegacy类用于向后兼容性,它的行为与未修改的Time类相同。
其他
辅助函数:
script_tag()和safe_mailto()不再在<script>标签中输出type="text/javascript"。CLI: 由于 Spark 命令处理的更改,
spark文件已更改。CLI:
CITestStreamFilter::$buffer = ''不再导致过滤器注册为侦听流。现在有一个CITestStreamFilter::registration()方法用于此目的。详情请参阅 在测试中捕获 STDERR 和 STDOUT 流。数据库:
BaseBuilder::_whereIn()中的InvalidArgumentException是LogicException的一种,不会被配置禁止。以前如果CI_DEBUG为 false,异常会被禁止。数据库: BaseConnection::getForeignKeyData() 返回的数据结构已更改。
数据库:
CodeIgniter\Database\BasePreparedQuery类现在对写入类型的查询返回布尔值,而不是Result类对象。模型: 如果
Model::update()方法生成没有 WHERE 子句的 SQL 语句,现在会引发DatabaseException;模型不支持更新所有记录的操作。路由:
RouteCollection::resetRoutes()会重置自动发现路由。以前一旦发现,即使调用RouteCollection::resetRoutes(),RouteCollection 也不会再发现 Routes 文件。
接口变更
备注
只要你没有扩展相关的 CodeIgniter 核心类 或实现这些接口,所有这些变化都是向后兼容的, 不需要任何干预。
OutgoingRequestInterface
添加新的
OutgoingRequestInterface,表示传出请求。添加新的
OutgoingRequest类,实现OutgoingRequestInterface。现在
RequestInterface扩展OutgoingRequestInterface。现在
CURLRequest扩展OutgoingRequest。现在
Request扩展OutgoingRequest。
其他
HTTP: 在
MessageInterface中添加了缺失的getProtocolVersion()、getBody()、hasHeader()和getHeaderLine()方法。HTTP: 现在
ResponseInterface扩展MessageInterface。HTTP: 添加了缺失的
ResponseInterface::getCSP()(和Response::getCSP()),ResponseInterface::getReasonPhrase()和ResponseInterface::getCookieStore()方法。数据库: 添加了缺失的
CodeIgniter\Database\ResultInterface::getNumRows()方法。参阅 验证变更。
方法签名变化
验证变更
ValidationInterface
ValidationInterface 已更改,以消除 ValidationInterface 与 Validation 类之间的不匹配。
为
ValidationInterface::run()添加了第三个参数$dbGroup。接口中添加了以下方法:
ValidationInterface::setRule()ValidationInterface::getRules()ValidationInterface::getRuleGroup()ValidationInterface::setRuleGroup()ValidationInterface::loadRuleGroup()ValidationInterface::hasError()ValidationInterface::listErrors()ValidationInterface::showError()
Validation
当 $group 为空时, Validation::loadRuleGroup() 的返回值已从 null 更改为 []。
数据库
CodeIgniter\Database\BasePreparedQuery::close()和CodeIgniter\Database\PreparedQueryInterface的返回类型已更改为bool(之前未定义)。CodeIgniter\Database\Database::loadForge()的返回类型已更改为Forge。CodeIgniter\Database\Database::loadUtils()的返回类型已更改为BaseUtils。Table::dropForeignKey()中的参数名$column已更改为$foreignName。BaseBuilder::updateBatch()的第二个参数$index已更改为$constraints。它现在接受 array、string 或RawSql类型。扩展类也应相应更改类型。BaseBuilder::insertBatch()和BaseBuilder::updateBatch()的$set参数现在接受单行数据的对象。BaseBuilder::_updateBatch()第二个参数
$values已更改为$keys。第三个参数
$index已更改为$values。参数类型也已更改为array。
数据库 Forge
Forge::dropKey()的方法签名已更改。添加了一个可选参数$prefixKeyName。Forge::addKey()的方法签名已更改。添加了一个可选参数$keyName。Forge::addPrimaryKey()的方法签名已更改。添加了一个可选参数$keyName。Forge::addUniqueKey()的方法签名已更改。添加了一个可选参数$keyName。以下方法添加了一个额外的
$asQuery参数。当设置为true时,该方法返回一个独立的 SQL 查询。CodeIgniter\Database\Forge::_processPrimaryKeys()
除了上面添加的
$asQuery参数外,以下方法现在也返回一个数组。CodeIgniter\Database\Forge::_processIndexes()CodeIgniter\Database\Forge::_processForeignKeys()
其他
API:
API\ResponseTrait::failServerError()的返回类型已更改为ResponseInterface。以下方法已更改为接受
ResponseInterface作为参数,而不是Response。Debug\Exceptions::__construct()Services::exceptions()
Request:
IncomingRequest::getJsonVar()的$index参数现在接受array、string或null值。
增强功能
命令
从
CodeIgniter\CodeIgniter类中提取了 Spark 命令的调用处理程序。这将减少控制台调用的成本。添加了
spark filter:check命令来检查路由的过滤器。详情请参阅 Controller Filters。添加了
spark make:cell命令来创建新的 Cell 文件及其视图。详情请参阅 通过命令生成单元。现在
spark routes命令显示路由名称。请参阅 URI 路由。现在
spark routes命令可以按处理程序排序输出。 请参阅 按处理程序排序。现在可以使用
--help选项访问 spark 命令的帮助信息(例如php spark serve --help)添加了
CLI::promptByMultipleKeys()方法以支持多值输入,与promptByKey()不同。详情请参阅 promptByMultipleKeys()。HTTP/3 现在被视为有效协议。
测试
添加了
StreamFilterTrait以更轻松地使用从 STDOUT 和 STDERR 流中捕获数据。请参阅 测试 CLI 输出。CITestStreamFilter 过滤器类现在实现了向流添加过滤器的方法。请参阅 测试 CLI 输出。
添加了
PhpStreamWrapper以更轻松地使用php://stdin设置数据。请参阅 测试 CLI 输入。添加了 Timer::record() 方法来测量可调用的性能。还增强了通用函数
timer()以接受可选的可调用。将布尔第三参数
$useExactComparison添加到TestLogger::didLog(),它设置是否逐字检查日志消息。默认为true。添加了
CIUnitTestCase::assertLogContains()方法,它通过消息的一部分而不是整个消息来比较日志消息。
数据库
查询构建器
向 QueryBuilder 添加了
upsert()和upsertBatch()方法。参见 更新插入数据。向 QueryBuilder 添加了
deleteBatch()方法。参见 DeleteBatch。添加了
when()和whenNot()方法以有条件地向查询添加子句。详情请参阅 BaseBuilder::when()。改进了
Builder::updateBatch()的 SQL 结构。详情请参阅 UpdateBatch。添加了
BaseBuilder::setQueryAsData(),它允许从查询中使用insertBatch()、updateBatch()、upsertBatch()、deleteBatch()。参见 insertBatch。
Forge
添加了
Forge::processIndexes(),允许在现有表上创建索引。详情请参阅 向表添加键。现在可以手动设置索引名称。这些方法包括:
Forge::addKey()、Forge::addPrimaryKey()和Forge::addUniqueKey()新的
Forge::dropPrimaryKey()方法允许删除表上的主键。参见 删除主键。修复了
Forge::dropKey(),以允许删除唯一索引。这需要DROP CONSTRAINTSQL命令。CodeIgniter\Database\Forge::addForeignKey()现在包括一个名称参数来手动设置外键名称。SQLite3 不支持此功能。SQLSRV 现在在使用 Forge::dropColumn() 时会自动删除
DEFAULT约束。
其他
SQLite3 有一个新的配置项
busyTimeout来设置表锁定时的超时。BaseConnection::escape()现在排除RawSql数据类型。这允许将 SQL 字符串传递到数据中。改进了 BaseConnection::getForeignKeyData() 返回的数据。所有 DBMS 返回相同的结构。
SQLite BaseConnection::getIndexData() 现在可以为 AUTOINCREMENT 列返回伪索引名为
PRIMARY,并且每个返回的索引数据都有type属性。BasePreparedQuery::close()现在在所有 DBMS 中都会释放准备好的语句。以前,它们在 Postgre、SQLSRV 和 OCI8 中没有被释放。参见 close()。添加了
BaseConnection::transException()用于在事务过程中抛出异常。参见:抛出异常。
模型
向
BaseModel::insertBatch()和BaseModel::updateBatch()方法添加了 before 和 after 事件。请参阅 使用查询构建器。添加了
Model::allowEmptyInserts()方法以插入空数据。请参阅 Using CodeIgniter’s Model为 Entity 添加了新的 属性转换 类
IntBoolCast。
库
Publisher: 在 Publisher 中添加了
replace()、addLineAfter()和addLineBefore()方法以修改文件。详情请参阅 Publisher。Encryption: 现在 Encryption 可以解密使用 CI3 Encryption 加密的数据。请参阅 用于与 CI3 保持兼容性的配置。
CURLRequest: 在 CURLRequest 中添加了 HTTP2 版本选项。
辅助函数和函数
现在可以通过 app/Config/Autoload.php 自动加载辅助函数。
添加了新的表单辅助函数
validation_errors()、validation_list_errors()和validation_show_error()来显示验证错误。如果你将 locale 值作为最后一个参数传入,可以为
route_to()设置 locale。添加了
request()和response()函数。添加了
decamelize()函数将 camelCase 转换为 snake_case。添加了
is_windows()全局函数来检测 Windows 平台。
HTML5 兼容性
通过在 app/Config/DocTypes.php 中设置 $html5 属性,可以配置创建诸如 <input> 之类的空 HTML 元素时是否排除或包含 solidus 字符 (/) 和右尖括号 (>) 之间的字符。如果将其设置为 true,则会输出不带 / 的 HTML5 兼容标签,如 <br>。
以下项目会受到影响:
排版类:创建
br标签视图解析器:
nl2br过滤器诱饵模式:
input标签表单辅助函数
HTML 辅助函数
常用函数
错误处理
现在可以记录弃用警告而不是抛出异常。详情请参阅 记录弃用警告。
弃用的记录默认启用。
要 临时 启用弃用抛出,请将环境变量
CODEIGNITER_SCREAM_DEPRECATIONS设置为真值。Config\Logger::$threshold现在默认为特定于环境。对于生产环境,默认阈值仍为4,但对于其他环境已更改为9。
多域名支持
添加了
Config\App::$allowedHostnames以设置基准 URL 中主机名以外的主机名。如果设置了
Config\App::$allowedHostnames,当当前 URL 匹配时,诸如base_url()、current_url()、site_url()之类的与 URL 相关的函数将返回使用Config\App::$allowedHostnames中设置的主机名的 URL。
其他
路由: 添加了
$routes->useSupportedLocalesOnly(true),以便当 URL 中的 locale 不在Config\App::$supportedLocales中受支持时,路由器返回 404 Not Found。请参阅 Localization路由: 添加了新的
$routes->view()方法以直接返回视图。请参阅 View Routes。视图: 视图 Cell 现在是一等公民,可以位于 app/Cells 目录中。请参阅 View Cells。
视图: 添加了“受控 Cell”,为你的视图 Cell 提供了更多结构和灵活性。详情请参阅 View Cells。
验证: 添加了闭包验证规则。详情请参阅 使用闭包规则。
配置: 现在可以指定要手动发现的 Composer 包。请参阅 Code Modules。
配置: 添加了
Config\Session类来处理会话配置。调试: 将 Kint 更新到 5.0.2。
请求: 添加了新的
$request->getRawInputVar()方法从原始流中返回指定变量。请参阅 Retrieving Raw data。请求: 添加了新的
$request->is()方法来查询请求类型。 请参阅 Determining Request Type。
消息变更
更新英文语言字符串以保持更一致。
添加了
CLI.generator.className.cell和CLI.generator.viewName.cell。添加了 en/Errors.php 文件。
变更
- 配置
Config类中的所有原子类型属性现已加类型。有关更改默认值的信息,请参阅 Upgrading。
- 更改了 Spark 命令的处理:
CodeIgniter\CodeIgniter不再处理 Spark 命令。已删除
CodeIgniter::isSparked()方法。已删除
CodeIgniter\CLI\CommandRunner类,因为 Spark 命令处理发生了变化。已删除系统路由配置文件
system/Config/Routes.php。应用路由配置文件
app/Config/Routes.php已更改。删除系统路由配置文件的包含。
弃用功能
弃用
RouteCollection::localizeRoute()。弃用
RouteCollection::fillRouteParams()。请使用RouteCollection::buildReverseRoute()。弃用
BaseBuilder::setUpdateBatch()和BaseBuilder::setInsertBatch()。请使用BaseBuilder::setData()。弃用公共属性
Response::$CSP。它将变为 protected。请使用Response::getCSP()。弃用
CodeIgniter::$path和CodeIgniter::setPath()。不再使用。弃用公共属性
IncomingRequest::$uri。它将变为 protected。请使用IncomingRequest::getUri()。弃用公共属性
IncomingRequest::$config。它将变为 protected。弃用
CLI::isWindows()方法。请使用is_windows()。弃用
Config\App中的会话属性,改用新的会话配置类Config\Session。
错误修复
修复了所有类型的“准备查询”在写入类型查询中返回
Result对象而不是 bool 值的错误。修复了在使用
IncomingRequest::getVar()或IncomingRequest::getJsonVar()方法时 JSON 请求中的变量过滤的错误。修复了在使用指定索引调用
IncomingRequest::getVar()或IncomingRequest::getJsonVar()方法时可能更改变量类型的错误。修复了启用 CSP 时 Honeypot 字段出现的错误。另请参阅 Honeypot 和 CSP。
有关完整的错误修复列表,请参阅仓库的 CHANGELOG.md。