# 版本 4.2.0

发布日期：2022 年 6 月 3 日

CodeIgniter4 的 4.2.0 版本发布

## 亮点

- 将最低 PHP 要求更新为 7.4。

- 为了使默认配置更安全,默认情况下关闭了自动路由。

- OCI8 驱动程序用于 Oracle 数据库 (由 ytetsuro 贡献)。参见 数据库。

- 改进的自动路由 (可选)(由 kenjis 贡献)。参见 新的改进的自动路由。

- 查询构建器对 子查询 和 UNION 的支持(由 Andrey Pyzhikov 贡献)。参见 数据库。

### 新贡献者

- @fdomgjoni99 在 #5608 中做出了他们的首次贡献

- @Nudasoft 在 #5715 中做出了他们的首次贡献

- @beganovich 在 #5823 中做出了他们的首次贡献

- @tcgumus 在 #5851 中做出了他们的首次贡献

- @michaelrk02 在 #5878 中做出了他们的首次贡献

- @datamweb 在 #5894 中做出了他们的首次贡献

- @xlii-chl 在 #5884 中做出了他们的首次贡献

- @valmorflores 在 #6051 中做出了他们的首次贡献

- @tearoom6 在 #6012 中做出了他们的首次贡献

- @lonnie-vault 在 #6060 中做出了他们的首次贡献

## 不兼容变更

### 方法签名更改

- `CodeIgniter\Database\BaseBuilder::join()` 和 `CodeIgniter\Database\*\Builder::join()` 的方法签名已更改。

- `Validation::setRule()` 的方法签名已更改。删除了 `$rules` 参数上的 `string` 类型提示。扩展类应相应地删除参数,以免破坏LSP。

- `CodeIgniter\CLI\CommandRunner::_remap()` 的方法签名已更改以修复一个错误。

- `Service::reset()` 和 `CIUnitTestCase::resetServices()` 的默认参数值已从 `false` 更改为 `true`。这是为了在测试期间消除意外问题,例如 `lang()` 获取不到翻译消息。

### 行为变化

- `CodeIgniter\CodeIgniter` 类有了一个新属性 `$context`,它在运行时必须有正确的上下文。因此,以下文件已更改:

    - `public/index.php`

    - `spark`

- `system/bootstrap.php` 文件已修改,可以轻松实现 预加载。返回 `CodeIgniter` 实例和加载 `.env` 文件已移动到 `index.php` 和 `spark` 中。

- `CodeIgniter\Autoloader\Autoloader::initialize()` 已更改行为以修复一个错误。以前,当 `$modules->discoverInComposer` 为 true 时,它只使用 Composer 的类映射。现在,如果可用,它总是使用 Composer 的类映射。

- 修复了一个错误,更改了通过 CLI::color() 输出的颜色代码。

- 为防止来自网页浏览器的意外访问,如果控制器添加到 cli 路由中(`$routes->cli()`),则该控制器的所有方法都不再通过自动路由访问。

- 对于那些扩展历史记录收集器的用户,他们可能需要更新 `History::setFiles()` 方法,这可能会破坏向后兼容性。

- 修复了 `dot_array_search()` 的意外行为。现在 `dot_array_search('foo.bar.baz', ['foo' => ['bar' => 23]])` 返回 `null`。以前的版本返回 `23`。

- `CodeIgniter::storePreviousURL()` 已更改为仅存储 Content-Type 为 `text/html` 的 URL。它还会影响 `previous_url()` 和 `redirect()->back()` 的行为。

## 增强功能

### 新的改进的自动路由

添加了一个可选的新的更安全的自动路由器。这些是与传统自动路由的更改:

- 控制器方法需要 HTTP 动词前缀,如 `getIndex()`、`postCreate()`。

    - 开发人员总是知道 HTTP 方法,因此不期望的 HTTP 方法的请求不会通过。

- 默认控制器(默认为 `Home`)和默认方法(默认为 `index`)必须在 URI 中省略。

    - 它限制控制器方法和 URI 之间的一对一对应关系。

    - 例如,默认情况下,你可以访问 `/`,但 `/home` 和 `/home/index` 会返回 404。

- 它检查方法的参数数。

    - 如果 URI 中的参数多于方法的参数,则结果为 404。

- 它不支持 `_remap()` 方法。

    - 它限制控制器方法和 URI 之间的一对一对应关系。

- 无法访问定义路由中的控制器。

    - 它完全区分通过 自动路由 可访问的控制器和通过 定义路由 可访问的控制器。

详情请参阅 自动路由（改进版）。

### 数据库

- 添加了新的 OCI8 数据库驱动。

    - 它可以访问 Oracle 数据库并支持 SQL 和 PL/SQL 语句。

- 查询构建器

    - 在 FROM 部分添加了子查询。请参阅 子查询。

    - 在 SELECT 部分添加了子查询。请参阅 Select。

    - `BaseBuilder::buildSubquery()` 方法现在可以接受可选的第三个参数 `string $alias`。

    - 并集查询。请参阅 联合查询。

- 原生 SQL 字符串支持

    - 添加了表示原生 SQL 字符串的类 `CodeIgniter\Database\RawSql`。

    - select()、where()、like()、join() 接受 `CodeIgniter\Database\RawSql` 实例。

    - `DBForge::addField()` 支持原生 SQL 字符串作为默认值。请参阅 将原始 SQL 字符串作为默认值。

- SQLite3 有一个新的配置项 `foreignKeys`,用于启用外键约束。

### 帮助器和函数

- HTML 辅助函数 `script_tag()` 现在使用 `null` 值以最小化形式编写布尔属性:`<script src="..." defer />`。请参阅 `script_tag()` 的示例代码。

- 在 `get_filenames()` 中添加第 4 个参数 `$includeDir`。请参阅 `get_filenames()`。

- 通过 `log_message()` 记录的异常信息现在得到了改进。它现在包括异常发生的文件和行号。它也不再截断消息。

    - 日志格式也已更改。如果用户依赖应用中的日志格式,新的日志格式为“<1-based count> <cleaned filepath>(<line>): <class><function><args>”

### 命令

- 添加了 `spark db:table` 命令。详情请参见 数据库命令。
    - 你现在可以在终端中查看当前连接数据库中的所有表名。

        - `spark db:table --show`

    - 或者你可以查看一个表的字段名和记录。

        - `spark db:table my_table`

        - `spark db:table my_table --limit-rows 50 --limit-field-value 20 --desc`

    - 或者你可以查看元数据,如列类型、表的最大长度。

        - `spark db:table my_table --metadata`

- `spark routes` 命令现在显示闭包路由、自动路由和过滤器。请参阅 URI 路由。

### 其它

- 在控制器中添加了 `$this->validateData()`。请参阅 $this->validateData()。

- 内容安全策略 (CSP) 增强

    - 在 `Config\ContentSecurityPolicy` 中添加了配置 `$scriptNonceTag` 和 `$styleNonceTag` 以自定义 CSP 占位符 (`{csp-script-nonce}` 和 `{csp-style-nonce}`)

    - 在 `Config\ContentSecurityPolicy` 中添加了配置 `$autoNonce` 以禁用 CSP 占位符替换

    - 添加了函数 `csp_script_nonce()` 和 `csp_style_nonce()` 来获取 nonce 属性

    - 详情请参阅 内容安全策略。

- 新的 视图装饰器 允许在缓存之前修改生成的 HTML。

- 添加了验证严格规则。请参阅 传统规则与严格规则。

- 在 app/Config/Mimes.php 中添加了对 webp 文件的支持。

- `RouteCollection::addRedirect()` 现在可以使用占位符。详细信息请参阅 重定向路由。

- 调试栏增强

    - 调试工具栏现在使用 `microtime()` 而不是 `time()`。

- 添加了 预加载 的示例文件。请参阅 preload.php。

## 变更

- 将最低 PHP 要求更新为 7.4。

- 为了使默认配置更安全,默认情况下关闭了自动路由。

- 验证。当使用带通配符 (*) 的字段时,更改了错误生成方式。现在错误键包含完整路径。请参阅 获取所有错误。

- 当使用通配符时, `Validation::getError()` 将返回匹配掩码的所有找到的错误字符串。

- 当前版本的内容安全策略(CSP)为脚本和样式标签输出一个 nonce。以前的版本为每个标签输出一个 nonce。

- 发送 cookie 的过程已移动到 `Response` 类中。现在 `Session` 类不再发送 cookie,而是将它们设置到 Response 中。

## 弃用功能

- 弃用 `CodeIgniter\Database\SQLSRV\Connection::getError()`。请使用 `CodeIgniter\Database\SQLSRV\Connection::error()`。

- 弃用 `CodeIgniter\Debug\Exceptions::cleanPath()` 和 `CodeIgniter\Debug\Toolbar\Collectors\BaseCollector::cleanPath()`。请使用 `clean_path()` 函数。

- 弃用 `CodeIgniter\Log\Logger::cleanFilenames()` 和 `CodeIgniter\Test\TestLogger::cleanup()`。请使用 `clean_path()` 函数。

- 弃用 `CodeIgniter\Router\Router::setDefaultController()`。

- 在 spark 中弃用常量 `SPARKED`。请使用 `CodeIgniter\CodeIgniter` 中的 `$context` 属性。

- 弃用 `CodeIgniter\Autoloader\Autoloader::discoverComposerNamespaces()`,不再使用。

- 弃用常量 `EVENT_PRIORITY_LOW`、`EVENT_PRIORITY_NORMAL` 和 `EVENT_PRIORITY_HIGH`。请使用类常量 `CodeIgniter\Events\Events::PRIORITY_LOW`、`CodeIgniter\Events\Events::PRIORITY_NORMAL` 和 `CodeIgniter\Events\Events::PRIORITY_HIGH`。

## Bug 修复

- SQLSRV 驱动程序忽略配置中的端口值。

有关完整的 Bug 修复列表，请参阅仓库的 CHANGELOG_4.2.md。