版本 4.4.0

发布日期:2023 年 8 月 25 日

CodeIgniter4 的 4.4.0 版本

亮点

  • 调试工具栏现在有一个新的“热重载”功能( lonnieezell 贡献)。参见 测试.

重大变更

行为变更

URI::setSegment() 和不存在的段

现在,当您设置最后一个 +2 段时,将抛出异常。在以前的版本中,只有当指定最后一个段 +3 或更多时才会抛出异常。请参阅 URI::setSegment() 更改

当前最后一个段的下一个段 (+1) 可以像以前一样设置。

工厂

传递带有命名空间的类名

现在 preferApp 仅在您请求 没有命名空间的类名 时才有效。

例如,当您调用 model(\Myth\Auth\Models\UserModel::class)model('Myth\Auth\Models\UserModel')

  • 之前

    • 如果存在,则返回 App\Models\UserModel,如果 preferApp 为 true(默认)

    • 如果存在,则返回 Myth\Auth\Models\UserModel,如果 preferApp 为 false

  • 之后

    • 返回 Myth\Auth\Models\UserModel,即使 preferApp 为 true(默认)

    • 如果您在调用 model() 之前定义了 Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel'),则返回 App\Models\UserModel

如果您错误地传递了不存在的类名,以前的版本将返回 AppConfig 命名空间中的类实例,因为 preferApp 功能。

例如,在控制器 (namespace App\Controllers) 中,如果您错误地调用了 config(Config\App::class)(注意类缺少前导 \),这意味着您实际上传递了 App\Controllers\Config\App。但该类不存在,因此现在工厂将返回 null

属性名称

属性 Factories::$basenames 已重命名为 $aliases

自动加载器

以前,CodeIgniter 的自动加载器允许加载以 .php 扩展名结尾的类名。这意味着实例化像 new Foo.php() 这样的对象是可能的,并且会实例化为 new Foo()。由于 Foo.php 是一个无效的类名,因此自动加载器的这种行为已更改。现在,实例化此类类将失败。

CodeIgniter 和 exit()

CodeIgniter::run() 方法不再调用 exit(EXIT_SUCCESS)。exit 调用已移至 public/index.php

站点 URI 更改

添加了一个新的 SiteURI 类,它扩展了 URI 类并表示站点 URI,现在它被用于许多需要当前 URI 的地方。

$this->request->getUri() 在控制器中返回 SiteURI 实例。此外,site_url()base_url()current_url() 在内部使用 SiteURI。

getPath()

getPath() 方法现在始终返回带有前导 / 的完整 URI 路径。因此,当您的 baseURL 具有子目录并且您想要获取相对于 baseURL 的相对路径时,您必须使用新的 getRoutePath() 方法。

例如

        baseURL: http://localhost:8888/CodeIgniter4/
The current URI: http://localhost:8888/CodeIgniter4/foo/bar
      getPath(): /CodeIgniter4/foo/bar
 getRoutePath(): foo/bar
站点 URI 值

SiteURI 类比以前更严格地规范化站点 URI,并且已修复了一些错误。

因此,框架可能会返回与以前版本略有不同的站点 URI 或 URI 路径。例如,/ 将添加到 index.php 之后

http://example.com/test/index.php?page=1

http://example.com/test/index.php/?page=1

接口更改

注意

只要您没有扩展相关的 CodeIgniter 核心类或实现这些接口,所有这些更改都是向后兼容的,不需要任何干预。

  • 验证:ValidationInterface 中添加了 getValidated() 方法。

方法签名更改

参数类型更改

  • 服务
    • Services::security() 的第一个参数已从 Config\App 更改为 Config\Security

    • Services::session() 的第一个参数已从 Config\App 更改为 Config\Session

  • 会话
    • Session::__construct() 的第二个参数已从 Config\App 更改为 Config\Session

    • 数据库的 BaseHandlerDatabaseHandlerFileHandlerMemcachedHandlerRedisHandler__construct() 的第一个参数已从 Config\App 更改为 Config\Session

  • 安全:Security::__construct() 的第一个参数已从 Config\App 更改为 Config\Security

  • 验证:Validation::check() 的方法签名已更改。 $rule 参数上的 string 类型提示已删除。

  • CodeIgniter:CodeIgniter::setRequest() 的方法签名已更改。 $request 参数上的 Request 类型提示已删除。

  • 功能测试用例
    • FeatureTestCase::populateGlobals() 的方法签名已更改。 $request 参数上的 Request 类型提示已删除。

    • 方法签名 FeatureTestCase::setRequestBody() 已更改。 Request 参数 $request 上的类型提示和返回类型 Request 已被移除。

新增参数

  • 路由:RouteCollection::__construct() 中添加了第三个参数 Routing $routing

移除参数

  • 服务:Services::exceptions() 中移除了第二个参数 $request 和第三个参数 $response

  • 错误处理:CodeIgniter\Debug\Exceptions::__construct() 中移除了第二个参数 $request 和第三个参数 $response

返回类型更改

  • 自动加载器: loadClassloadClassmap 方法的返回签名被设置为 void,以与 spl_autoload_registerspl_autoload_unregister 函数中的回调兼容。

增强功能

命令

  • spark routes
    • 现在您可以在请求 URL 中指定主机。请参阅 指定主机

    • 它在 Handler 中显示了 视图路由 的视图文件,如下所示

      方法

      路由

      名称

      处理程序

      前置过滤器

      后置过滤器

      GET

      about

      »

      (视图) pages/about

      工具栏

测试

  • 调试栏
    • 调试工具栏现在有一个新的“热重载”功能,可以用来在文件更改时自动重新加载页面。参见 热重载.

    • 现在 视图路由 显示在 定义的路由 中,位于 路由 选项卡上。

数据库

  • MySQLi: 在数据库配置中添加了 numberNative 属性,以保持 SQL 查询后获得的变量类型与数据库中设置的类型一致。参见 数据库配置.

  • SQLSRV: 字段元数据现在包含 nullable。参见 $db->getFieldData().

模型

  • 为实体添加了特殊的 getter/setter,以避免方法名称冲突。参见 特殊 getter/setter.

  • 验证: 添加了 Validation::getValidated() 方法,用于获取实际验证后的数据。有关详细信息,请参见 获取验证后的数据.

  • 图像: 现在可以使用 $quality 选项压缩 WebP 图像。

  • 上传的文件: 添加了 UploadedFiles::getClientPath() 方法,如果文件是通过目录上传上传的,则该方法返回文件的 full_path 索引的值。

  • CURLRequest: 添加了请求选项 proxy。参见 CURLRequest 类.

  • URI: 添加了一个新的 SiteURI 类,该类扩展了 URI 并表示站点 URI。

助手和函数

  • 数组: 添加了 array_group_by() 辅助函数来对数据值进行分组。支持点符号语法。

  • 通用: force_https() 不再终止应用程序,而是抛出 RedirectException

其他

  • DownloadResponse: 添加了 DownloadResponse::inline() 方法,该方法设置 Content-Disposition: inline 标头以在浏览器中显示文件。有关详细信息,请参阅 在浏览器中打开文件

  • 视图:renderSection() 上添加了可选的第二个参数 $saveData,以防止在显示后自动清除数据。有关详细信息,请参阅 视图布局

  • 自动路由(改进):
    • 现在您可以路由到模块。有关详细信息,请参阅 模块路由

    • 如果找到与 URI 段对应的控制器,并且该控制器没有为 URI 段定义方法,则现在将执行默认方法。此添加允许更灵活地处理自动路由中的 URI。有关详细信息,请参阅 默认方法回退

  • 过滤器: 现在您可以使用 $filters 属性 的过滤器参数。

  • 请求: 添加了 IncomingRequest::setValidLocales() 方法来设置有效的语言环境。

  • 表格: 添加了 Table::setSyncRowsWithHeading() 方法来同步行列与标题。有关详细信息,请参阅 同步行与标题

  • 错误处理: 现在您可以使用 自定义异常处理程序

  • 重定向异常
    • 它也可以接受一个实现 ResponseInterface 接口的对象作为第一个参数。

    • 它实现了 ResponsableInterface 接口。

  • 工厂

消息变更

  • 添加了 Core.invalidDirectory 错误消息。

  • 改进了 HTTP.invalidHTTPProtocol 错误消息。

变更

  • 图像: GDHandler 中 WebP 的默认质量已从 80 更改为 90。

  • 配置
    • 已删除 app/Config/App.php 中已弃用的 Cookie 项目。

    • 已删除 app/Config/App.php 中已弃用的 Session 项目。

    • 已删除 app/Config/App.php 中已弃用的 CSRF 项目。

    • 路由设置已移至 app/Config/Routing.php 配置文件。请参阅 升级指南

  • DownloadResponse: 生成响应头时,如果之前已指定 Content-Disposition 头,则不会替换它。

  • 自动加载器
    • 在 v4.4.0 之前,CodeIgniter 自动加载器不允许在某些操作系统上文件名中使用非法特殊字符。可以使用以下符号:/_.:\ 和空格。因此,如果您将 CodeIgniter 安装在包含特殊字符(如 () 等)的文件夹下,CodeIgniter 将无法正常工作。从 v4.4.0 开始,此限制已被移除。

    • 方法 Autoloader::loadClass()Autoloader::loadClassmap() 现在都被标记为 @internal

  • 路由集合:受保护属性 $routes 的数组结构已为性能而修改。

  • HSTS:现在 force_https()Config\App::$forceGlobalSecureRequests = true 设置 HTTP 状态码 307,这允许在重定向后保留 HTTP 请求方法。在之前的版本中,它是 302。

弃用

  • 实体:Entity::setAttributes() 已被弃用。请改用 Entity::injectRawData()

  • 错误处理:CodeIgniter\Debug\Exceptions 中的许多方法和属性已弃用。因为这些方法已移至 BaseExceptionHandlerExceptionHandler

  • 自动加载器: Autoloader::sanitizeFilename() 已弃用。

  • CodeIgniter
    • CodeIgniter::$returnResponse 属性已弃用。不再使用。

    • CodeIgniter::$cacheTTL 属性已弃用。不再使用。请使用 ResponseCache 代替。

    • CodeIgniter::cache() 方法已弃用。不再使用。请使用 ResponseCache 代替。

    • CodeIgniter::cachePage() 方法已弃用。不再使用。请使用 ResponseCache 代替。

    • CodeIgniter::generateCacheName() 方法已弃用。不再使用。请使用 ResponseCache 代替。

    • CodeIgniter::callExit() 方法已弃用。不再使用。

  • 重定向异常: \CodeIgniter\Router\Exceptions\RedirectException 已弃用。请使用 \CodeIgniter\HTTP\Exceptions\RedirectException 代替。

  • 会话: Session 中的属性 $sessionDriverName$sessionCookieName$sessionExpiration$sessionSavePath$sessionMatchIP$sessionTimeToUpdate$sessionRegenerateDestroy 已弃用,不再使用。请使用 $config 代替。

  • 安全: Security 中的属性 $csrfProtection$tokenRandomize$tokenName$headerName$expires$regenerate$redirect 已弃用,不再使用。请使用 $config 代替。

  • URI
    • URI::$uriString 已弃用。

    • URI::$baseURL 已弃用。请使用 SiteURI 代替。

    • URI::setSilent() 已弃用。

    • URI::setScheme() 已弃用。请使用 withScheme() 代替。

    • URI::setURI() 已弃用。

  • IncomingRequest
    • IncomingRequest::detectURI() 已弃用且不再使用。

    • IncomingRequest::detectPath() 已弃用且不再使用。它已移至 SiteURIFactory

    • IncomingRequest::parseRequestURI() 已弃用且不再使用。它已移至 SiteURIFactory

    • IncomingRequest::parseQueryString() 已弃用且不再使用。它已移至 SiteURIFactory

    • IncomingRequest::setPath() 已弃用。

已修复的错误

  • 自动路由(改进):在以前的版本中,当 $translateURIDashes 为 true 时,两个 URI 对应于单个控制器方法,一个 URI 用于连字符(例如,foo-bar),另一个 URI 用于下划线(例如,foo_bar)。此错误已修复。现在,下划线 URI(foo_bar)不可访问。

  • 输出缓冲:修复了输出缓冲的错误。

  • ControllerTestTraitControllerTestTrait::withUri() 使用 URI 创建一个新的 Request 实例。因为 Request 实例应该具有 URI 实例。此外,如果 URI 字符串中的主机名与 Config\App 无效,则将设置有效主机名。

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