从 4.2.12 升级到 4.3.0

请参阅与安装方法相对应的升级说明。

Composer 版本

重要

如果您使用 Composer,CodeIgniter v4.3.0 需要 Composer 2.0.14 或更高版本。

如果您使用的是旧版本的 Composer,请升级您的 composer 工具,删除 vendor/ 目录,并再次运行 composer update

例如,过程如下

composer self-update
rm -rf vendor/
composer update

强制文件更改

spark

以下文件收到了重大更改,您**必须将更新后的版本**与您的应用程序合并

  • spark

重要

如果您不更新此文件,则在运行 composer update 后,Spark 命令将完全不起作用。

例如,升级过程如下

composer update
cp vendor/codeigniter4/framework/spark .

配置文件

app/Config/Kint.php

  • app/Config/Kint.php 已针对 Kint 5.0 更新。

  • 您需要将

    • Kint\Renderer\Renderer 替换为 Kint\Renderer\AbstractRenderer

    • Renderer::SORT_FULL 替换为 AbstractRenderer::SORT_FULL

app/Config/Exceptions.php

  • 如果您使用的是 PHP 8.2,则需要添加新属性 $logDeprecations$deprecationLogLevel

模拟配置文件类

  • 如果您在测试中使用以下模拟配置文件类,则需要更新 app/Config 中的相应配置文件

    • MockAppConfig (Config\App)

    • MockCLIConfig (Config\App)

    • MockSecurityConfig (Config\Security)

  • 在这些配置文件类的属性中添加 类型。您可能需要修复属性值以匹配属性类型。

composer.json

如果您手动安装了 CodeIgnter,并且正在使用 Composer,则需要删除以下行,并运行 composer update

{
    ...
    "require": {
        ...
        "kint-php/kint": "^4.2",  <-- Remove this line
        ...
    },
    ...
    "scripts": {
        "post-update-cmd": [
            "CodeIgniter\\ComposerScripts::postUpdate"  <-- Remove this line
        ],
        "test": "phpunit"
    },
    ...
}

重大更改

数据库异常更改

  • 当发生数据库错误时,异常类可能会更改。如果您捕获异常,则必须确认您的代码可以捕获异常。

  • 现在,即使 CI_DEBUG 为 false,也会抛出一些异常。

  • 在事务期间,即使 DBDebug 为 true,也不会默认抛出异常。如果您希望抛出异常,则需要调用 transException(true)。请参阅 抛出异常

  • 有关详细信息,请参阅 发生数据库错误时的异常

未捕获异常的 HTTP 状态代码和退出代码

  • 如果您希望异常代码作为HTTP 状态代码,则 HTTP 状态代码将更改。在这种情况下,您需要在异常中实现 HTTPExceptionInterface。请参阅 在异常中指定 HTTP 状态代码

  • 如果您希望基于异常代码退出代码,则退出代码将更改。在这种情况下,您需要在异常中实现 HasExitCodeInterface。请参阅 在异常中指定退出代码

redirect()->withInput() 和验证错误

redirect()->withInput() 和验证错误有一个未记录的行为。如果您使用 withInput() 进行重定向,则 CodeIgniter 会将验证错误存储在会话中,您可以在重定向的页面中从验证对象获取错误在运行新验证之前

// In the controller
if (! $this->validate($rules)) {
    return redirect()->back()->withInput();
}

// In the view of the redirected page
<?= service('Validation')->listErrors() ?>

此行为是一个错误,已在 v4.3.0 中修复。

如果您有依赖于 bug 的代码,则需要更改代码。使用新的表单帮助器,validation_errors()validation_list_errors()validation_show_error() 来显示验证错误,而不是验证对象。

验证更改

  • ValidationInterface 已更改。已实现的类应同样添加方法和参数,以免破坏 LSP。有关详细信息,请参阅 验证更改

  • Validation::loadRuleGroup() 的返回值已从 null 更改为 [],其中 $group 为空。如果您依赖于该行为,请更新代码。

时间修复

  • 由于错误修复,Time 中的一些方法已从可变行为更改为不可变;Time 现在扩展 DateTimeImmutable。有关详细信息,请参阅 变更日志

  • 如果您需要修改前 Time 的行为,则已添加了一个兼容的 TimeLegacy 类。请用 TimeLegacy 替换应用程序代码中的所有 Time

  • 但是 TimeLegacy 已弃用。因此,我们建议您更新代码。

例如。

// Before
$time = Time::now();
// ...
if ($time instanceof DateTime) {
    // ...
}

// After
$time = Time::now();
// ...
if ($time instanceof DateTimeInterface) {
    // ...
}
// Before
$time1 = new Time('2022-10-31 12:00');
$time2 = $time1->modify('+1 day');
echo $time1; // 2022-11-01 12:00:00
echo $time2; // 2022-11-01 12:00:00

// After
$time1 = new Time('2022-10-31 12:00');
$time2 = $time1->modify('+1 day');
echo $time1; // 2022-10-31 12:00:00
echo $time2; // 2022-11-01 12:00:00

在测试中捕获 STDERR 和 STDOUT 流

捕获错误和输出流的方式已更改。现在,而不是

use CodeIgniter\Test\Filters\CITestStreamFilter;

protected function setUp(): void
{
    CITestStreamFilter::$buffer = '';
    $this->streamFilter         = stream_filter_append(STDOUT, 'CITestStreamFilter');
    $this->streamFilter         = stream_filter_append(STDERR, 'CITestStreamFilter');
}

protected function tearDown(): void
{
    stream_filter_remove($this->streamFilter);
}

需要使用

use CodeIgniter\Test\Filters\CITestStreamFilter;

protected function setUp(): void
{
    CITestStreamFilter::registration();
    CITestStreamFilter::addOutputFilter();
    CITestStreamFilter::addErrorFilter();
}

protected function tearDown(): void
{
    CITestStreamFilter::removeOutputFilter();
    CITestStreamFilter::removeErrorFilter();
}

或使用特性 CodeIgniter\Test\StreamFilterTrait。请参阅 测试 CLI 输出

接口更改

已修复一些接口。有关详细信息,请参阅 接口更改

外键数据

  • BaseConnection::getForeignKeyData() 返回的数据结构已更改。您需要调整依赖此方法的任何代码以使用新结构。

示例: tableprefix_table_column1_column2_foreign

返回的数据具有以下结构

/**
 * @return array[
 *    {constraint_name} =>
 *        stdClass[
 *            'constraint_name'     => string,
 *            'table_name'          => string,
 *            'column_name'         => string[],
 *            'foreign_table_name'  => string,
 *            'foreign_column_name' => string[],
 *            'on_delete'           => string,
 *            'on_update'           => string,
 *            'match'               => string
 *        ]
 * ]
 */

破坏性增强

多域支持

  • 如果您设置 Config\App::$allowedHostnames,则与 URL 相关的函数(如 base_url()current_url()site_url())将返回 URL,其中主机名在 Config\App::$allowedHostnames 中设置,如果当前 URL 匹配。

数据库

  • CodeIgniter\Database\Database::loadForge() 的返回类型已更改为 Forge。扩展类也应更改类型。

  • CodeIgniter\Database\Database::loadUtils() 的返回类型已更改为 BaseUtils。扩展类也应更改类型。

  • BaseBuilder::updateBatch() 的第二个参数 $index 已更改为 $constraints。它现在接受类型数组、字符串或 RawSql。扩展类也应更改类型。

  • BaseBuilder::insertBatch()BaseBuilder::updateBatch()$set 参数现在接受单行数据的对象。扩展类也应更改类型。

  • BaseBuilder::_updateBatch() 的第三个参数 $index 已更改为 $values,并且参数类型已更改为 array。扩展类也应更改类型。

  • Model::update() 方法现在会引发一个 DatabaseException,如果它生成一个没有 WHERE 子句的 SQL 语句。如果你需要更新表中的所有记录,请使用查询生成器。例如,$model->builder()->update($data)

蜜罐和 CSP

当 CSP 启用时,id 属性 id="hpc" 将被注入到蜜罐字段的容器标签中以隐藏该字段。如果你的视图中已经使用了该 id,你需要使用 Config\Honeypot::$containerId 更改它。你可以在 Config\Honeypot::$container 中移除 style="display:none"

其他

  • 助手:由于 html_helperform_helper 或通用函数中的空 HTML 元素(例如 <input>)默认情况下已更改为与 HTML5 兼容,并且你需要与 XHTML 兼容,你必须将 app/Config/DocTypes.php 中的 $html5 属性设置为 false

  • CLI:由于 Spark 命令的启动从 CodeIgniter\CodeIgniter 中提取,如果 Services::codeigniter() 服务已被覆盖,则运行这些命令时可能会出现问题。

项目文件

项目空间(根目录、app、public、writable)中的许多文件都收到了更新。由于这些文件在 system 范围之外,因此未经你的干预,它们不会被更改。有一些第三方 CodeIgniter 模块可用于协助合并对项目空间的更改:在 Packagist 上探索

内容更改

以下文件收到了重大更改(包括弃用或视觉调整),建议您将更新版本与您的应用程序合并

配置

  • app/Config/App.php
    • 新属性 $allowedHostnames 已添加,用于在站点 URL 中设置允许的主机名,而不是 $baseURL 中的主机名。请参阅 多域支持

    • 属性 $appTimezone 已更改为 UTC,以避免受夏令时影响。

  • app/Config/Autoload.php
    • 新属性 $helpers 已添加,用于自动加载助手。

  • app/Config/Database.php
  • app/Config/DocTypes.php
    • 属性 $html5 用于确定是否为无效 HTML 元素(例如 <input>)移除斜杠 (/) 字符,并默认设置为 true 以实现 HTML5 兼容性。

  • app/Config/Encryption.php
    • 新属性 $rawData$encryptKeyInfo$authKeyInfo 已添加,以实现与 CI3 加密兼容。请参阅 与 CI3 兼容的配置

  • app/Config/Exceptions.php
    • 添加了两个额外的公共属性:$logDeprecations$deprecationLogLevel。有关详细信息,请参阅 记录弃用警告

  • app/Config/Honeypot.php
    • 新属性 $containerId 已添加,用于在启用 CSP 时为容器标记设置 id 属性值。

    • 属性 $template 值中的 input 标记已更改为 HTML5 兼容。

  • app/Config/Logger.php
    • 在非 production 环境中,$threshold 属性已更改为 9

  • app/Config/Modules.php
    • 添加了新属性 $composerPackages,以限制 Composer 包自动发现,从而提高性能。

  • app/Config/Routes.php
    • 由于运行 Spark 命令的方法已更改,因此不再需要加载框架的内部路由 (SYSTEMPATH . 'Config/Routes.php')。

  • app/Config/Security.php
    • $redirect 属性的值更改为 false,以防止在 CSRF 检查失败时进行重定向。这样做是为了更容易识别 CSRF 错误。

  • app/Config/Session.php
    • 已添加以处理会话配置。

  • app/Config/Validation.php

视图文件

以下视图文件已更改为与 HTML5 兼容的标记。此外,错误消息现在在 Errors 语言文件中定义。

  • app/Views/errors/html/error_404.php

  • app/Views/errors/html/error_exception.php

  • app/Views/errors/html/production.php

  • app/Views/welcome_message.php

所有更改

以下是 项目空间 中收到更改的所有文件列表;其中许多将是简单的注释或格式,对运行时没有影响。所有 Config 类中的原子类型属性都已键入

  • app/Config/App.php

  • app/Config/Autoload.php

  • app/Config/CURLRequest.php

  • app/Config/Cache.php

  • app/Config/ContentSecurityPolicy.php

  • app/Config/Cookie.php

  • app/Config/Database.php

  • app/Config/DocTypes.php

  • app/Config/Email.php

  • app/Config/Encryption.php

  • app/Config/Exceptions.php

  • app/Config/Feature.php

  • app/Config/Filters.php

  • app/Config/Format.php

  • app/Config/Generators.php

  • app/Config/Honeypot.php

  • app/Config/Images.php

  • app/Config/Kint.php

  • app/Config/Logger.php

  • app/Config/Migrations.php

  • app/Config/Mimes.php

  • app/Config/Modules.php

  • app/Config/Pager.php

  • app/Config/Paths.php

  • app/Config/Routes.php

  • app/Config/Security.php

  • app/Config/Session.php

  • app/Config/Toolbar.php

  • app/Config/UserAgents.php

  • app/Config/Validation.php

  • app/Views/errors/html/error_404.php

  • app/Views/errors/html/error_exception.php

  • app/Views/errors/html/production.php

  • app/Views/welcome_message.php

  • composer.json

  • env

  • phpunit.xml.dist

  • spark