版本 4.2.0

发布日期:2022 年 6 月 3 日

CodeIgniter4 的 4.2.0 版本

亮点

  • 将最小 PHP 要求更新为 7.4。

  • 为了使默认配置更安全,自动路由已默认禁用。

  • OCI8 驱动程序用于 Oracle 数据库 ytetsuro 贡献)。参见 数据库.

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

  • 查询构建器 子查询UNION 支持( Andrey Pyzhikov 贡献)。参见 数据库.

新贡献者

重大变更

方法签名变更

  • 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.phpspark

  • CodeIgniter\Autoloader\Autoloader::initialize() 已更改行为以修复一个错误。它以前仅在 $modules->discoverInComposer 为 true 时才使用 Composer 类映射。现在,如果 Composer 可用,它始终使用 Composer 类映射。

  • CLI::color() 输出的颜色代码已更改以修复一个错误。

  • 为了防止从 Web 浏览器进行意外访问,如果将控制器添加到 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 部分添加了子查询。请参阅 选择

    • BaseBuilder::buildSubquery() 方法可以接受可选的第三个参数 string $alias

    • 联合查询。请参阅 联合查询

  • 原始 SQL 字符串支持
  • SQLite3 具有一个新的配置项 foreignKeys,它启用外键约束。

助手和函数

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

  • get_filenames() 函数中添加了第四个参数 $includeDir。请查看 get_filenames()

  • 通过 log_message() 记录的异常信息现在得到了改进。它现在包含了异常发生的源文件和行号。它也不再截断消息。
    • 日志格式也发生了变化。如果用户在应用程序中依赖日志格式,新的日志格式为“<基于 1 的计数> <清理后的文件路径>(<行号>): <类><函数><参数>”

命令

  • 添加了 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 路由

其他

  • 在 Controller 中添加了 $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() 现在可以使用占位符。有关详细信息,请参阅 重定向路由

  • Debugbar 增强功能
    • 调试工具栏现在使用 microtime() 而不是 time()

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

更改

  • 将最小 PHP 要求更新为 7.4。

  • 为了使默认配置更安全,自动路由已默认禁用。

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

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

  • 当前版本的 Content Security Policy (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_LOWEVENT_PRIORITY_NORMALEVENT_PRIORITY_HIGH 已被弃用。请使用类常量 CodeIgniter\Events\Events::PRIORITY_LOWCodeIgniter\Events\Events::PRIORITY_NORMALCodeIgniter\Events\Events::PRIORITY_HIGH 代替。

已修复的错误

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

有关已修复错误的完整列表,请参阅仓库的 CHANGELOG_4.2.md