|
| 1 | +版本 4.4.0 |
| 2 | +############# |
| 3 | + |
| 4 | +发布日期:2023年8月25日 |
| 5 | + |
| 6 | +CodeIgniter4 的 4.4.0 版本发布 |
| 7 | + |
| 8 | +.. contents:: |
| 9 | + :local: |
| 10 | + :depth: 3 |
| 11 | + |
| 12 | +亮点 |
| 13 | +********** |
| 14 | + |
| 15 | +- 调试工具栏现在具有新的“热重载”功能 |
| 16 | + (*由* `lonnieezell <https://github.com/lonnieezell>`_ 贡献)。 |
| 17 | + 请参阅 `测试`_。 |
| 18 | + |
| 19 | +重大变更 |
| 20 | +******** |
| 21 | + |
| 22 | +行为变更 |
| 23 | +================ |
| 24 | + |
| 25 | +URI::setSegment() 和不存在的段 |
| 26 | +------------------------------------------ |
| 27 | + |
| 28 | +当你设置最后一个 ``+2`` 段时,现在会抛出异常。 |
| 29 | +在之前的版本中,只有当指定了最后一个段的 ``+3`` 或更多时才会抛出异常。请参阅 :ref:`upgrade-440-uri-setsegment`。 |
| 30 | + |
| 31 | +当前最后一个段的下一个段(``+1``)可以像以前一样设置。 |
| 32 | + |
| 33 | +.. _v440-factories: |
| 34 | + |
| 35 | +工厂 |
| 36 | +--------- |
| 37 | + |
| 38 | +使用命名空间传递类名 |
| 39 | +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 40 | + |
| 41 | +现在,只有在请求 :ref:`不带命名空间的类名 <factories-passing-classname-without-namespace>` 时,``preferApp`` 才起作用。 |
| 42 | + |
| 43 | +例如,当你调用 ``model(\Myth\Auth\Models\UserModel::class)`` 或 |
| 44 | +``model('Myth\Auth\Models\UserModel')`` 时: |
| 45 | + |
| 46 | + - 之前: |
| 47 | + |
| 48 | + - 如果存在 ``App\Models\UserModel`` 并且 ``preferApp`` 为 true(默认值),则返回该类 |
| 49 | + - 如果存在 ``Myth\Auth\Models\UserModel`` 并且 ``preferApp`` 为 false,则返回该类 |
| 50 | + |
| 51 | + - 现在: |
| 52 | + |
| 53 | + - 无论 ``preferApp`` 是否为 true(默认值),都返回 ``Myth\Auth\Models\UserModel`` |
| 54 | + - 如果在调用 ``model()`` 之前定义了 ``Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel')``,则返回 ``App\Models\UserModel`` |
| 55 | + |
| 56 | +如果你错误地传递了一个不存在的类名,之前的版本会返回 ``App`` 或 ``Config`` 命名空间中的类实例,因为存在 ``preferApp`` 功能。 |
| 57 | + |
| 58 | +例如,在控制器(``namespace App\Controllers``)中,如果你错误地调用了 ``config(Config\App::class)`` (注意类名缺少前导的 ``\``),实际上传递的是 ``App\Controllers\Config\App``。 |
| 59 | +但是该类不存在,因此 Factories 现在将返回 ``null``。 |
| 60 | + |
| 61 | +属性名称 |
| 62 | +^^^^^^^^^^^^^ |
| 63 | + |
| 64 | +属性 ``Factories::$basenames`` 已更名为 ``$aliases``。 |
| 65 | + |
| 66 | +自动加载器 |
| 67 | +---------- |
| 68 | + |
| 69 | +以前,CodeIgniter 的自动加载器允许加载以 `.php` 扩展名结尾的类名。这意味着可以实例化类似 `new Foo.php()` 的对象,并将其实例化为 `new Foo()`。由于 `Foo.php` 是无效的类名,自动加载器的行为已更改。现在,实例化这样的类将失败。 |
| 70 | + |
| 71 | +.. _v440-codeigniter-and-exit: |
| 72 | + |
| 73 | +CodeIgniter 和 exit() |
| 74 | +---------------------- |
| 75 | + |
| 76 | +``CodeIgniter::run()`` 方法不再调用 ``exit(EXIT_SUCCESS)``。退出调用已移至 **public/index.php**。 |
| 77 | + |
| 78 | +.. _v440-site-uri-changes: |
| 79 | + |
| 80 | +站点 URI 更改 |
| 81 | +---------------- |
| 82 | + |
| 83 | +添加了一个扩展了 ``URI`` 类并表示站点 URI 的新 ``SiteURI`` 类,并且现在在许多需要当前 URI 的地方使用它。 |
| 84 | + |
| 85 | +控制器中的 ``$this->request->getUri()`` 返回 ``SiteURI`` 实例。 |
| 86 | +此外,:php:func:`site_url()` 、:php:func:`base_url()` 和 :php:func:`current_url()` |
| 87 | +在内部使用 SiteURI。 |
| 88 | + |
| 89 | +getPath() |
| 90 | +^^^^^^^^^ |
| 91 | + |
| 92 | +``getPath()`` 方法现在始终返回带有前导 ``/`` 的完整 URI 路径。 |
| 93 | +因此,当你的 baseURL 具有子目录并且你想获取相对于 baseURL 的路径时,必须使用新的 ``getRoutePath()`` 方法。 |
| 94 | + |
| 95 | +例如:: |
| 96 | + |
| 97 | + baseURL: http://localhost:8888/CodeIgniter4/ |
| 98 | + 当前 URI: http://localhost:8888/CodeIgniter4/foo/bar |
| 99 | + getPath(): /CodeIgniter4/foo/bar |
| 100 | + getRoutePath(): foo/bar |
| 101 | + |
| 102 | +站点 URI 值 |
| 103 | +^^^^^^^^^^^^^^^ |
| 104 | + |
| 105 | +SiteURI 类现在比以前更严格地规范化站点 URI,并修复了一些错误。 |
| 106 | + |
| 107 | +因此,与之前的版本相比,框架可能会以稍微不同的方式返回站点 URI 或 URI 路径。 |
| 108 | +例如,在 ``index.php`` 之后会添加 ``/``:: |
| 109 | + |
| 110 | + http://example.com/test/index.php?page=1 |
| 111 | + ↓ |
| 112 | + http://example.com/test/index.php/?page=1 |
| 113 | + |
| 114 | +.. _v440-interface-changes: |
| 115 | + |
| 116 | +接口更改 |
| 117 | +================= |
| 118 | + |
| 119 | +.. note:: 只要你没有扩展相关的 CodeIgniter 核心类或实现这些接口,所有这些更改都是向后兼容的,无需干预。 |
| 120 | + |
| 121 | +- **Validation:** 在 ``ValidationInterface`` 中添加了 ``getValidated()`` 方法。 |
| 122 | + |
| 123 | +.. _v440-method-signature-changes: |
| 124 | + |
| 125 | +方法签名更改 |
| 126 | +======================== |
| 127 | + |
| 128 | +.. _v440-parameter-type-changes: |
| 129 | + |
| 130 | +参数类型更改 |
| 131 | +---------------------- |
| 132 | + |
| 133 | +- **Services:** |
| 134 | + - ``Services::security()`` 的第一个参数已从 ``Config\App`` 更改为 ``Config\Security``。 |
| 135 | + - ``Services::session()`` 的第一个参数已从 ``Config\App`` 更改为 ``Config\Session``。 |
| 136 | +- **Session:** |
| 137 | + - ``Session::__construct()`` 的第二个参数已从 ``Config\App`` 更改为 ``Config\Session``。 |
| 138 | + - 数据库的 ``BaseHandler``、``DatabaseHandler``、``FileHandler``、``MemcachedHandler`` 和 ``RedisHandler`` 中的 ``__construct()`` 的第一个参数已从 ``Config\App`` 更改为 ``Config\Session``。 |
| 139 | +- **Security:** ``Security::__construct()`` 的第一个参数已从 ``Config\App`` 更改为 ``Config\Security``。 |
| 140 | +- **Validation:** ``Validation::check()`` 的方法签名已更改。``$rule`` 参数上的 ``string`` 类型提示已被删除。 |
| 141 | +- **CodeIgniter:** ``CodeIgniter::setRequest()`` 的方法签名已更改。``$request`` 参数上的 ``Request`` 类型提示已被删除。 |
| 142 | +- **FeatureTestCase:** |
| 143 | + - ``FeatureTestCase::populateGlobals()`` 的方法签名已更改。``$request`` 参数上的 ``Request`` 类型提示已被删除。 |
| 144 | + - ``FeatureTestCase::setRequestBody()`` 的方法签名已更改。``$request`` 参数上的 ``Request`` 类型提示和返回类型 ``Request`` 已被删除。 |
| 145 | + |
| 146 | +添加的参数 |
| 147 | +---------------- |
| 148 | + |
| 149 | +- **Routing:** 在 ``RouteCollection::__construct()`` 中添加了第三个参数 ``Routing $routing``。 |
| 150 | + |
| 151 | +删除的参数 |
| 152 | +------------------ |
| 153 | + |
| 154 | +- **Services:** 在 ``Services::exceptions()`` 中删除了第二个参数 ``$request`` 和第三个参数 ``$response``。 |
| 155 | +- **错误处理:** 在 ``CodeIgniter\Debug\Exceptions::__construct()`` 中删除了第二个参数 ``$request`` 和第三个参数 ``$response``。 |
| 156 | + |
| 157 | +返回类型更改 |
| 158 | +------------------- |
| 159 | + |
| 160 | +- **自动加载器:** ``loadClass`` 和 ``loadClassmap`` 方法的返回签名都改为 ``void``,以便与 ``spl_autoload_register`` 和 ``spl_autoload_unregister`` 函数中的回调兼容。 |
| 161 | + |
| 162 | +增强功能 |
| 163 | +************ |
| 164 | + |
| 165 | +命令 |
| 166 | +======== |
| 167 | + |
| 168 | +- **spark routes:** |
| 169 | + - 现在你可以在请求 URL 中指定主机。 |
| 170 | + 请参阅 :ref:`routing-spark-routes-specify-host`。 |
| 171 | + - 它在 *Handler* 中显示 :ref:`view-routes` 的视图文件,如下所示: |
| 172 | + |
| 173 | + +---------+-------------+------+------------------------------+----------------+---------------+ |
| 174 | + | Method | Route | Name | Handler | Before Filters | After Filters | |
| 175 | + +---------+-------------+------+------------------------------+----------------+---------------+ |
| 176 | + | GET | about | » | (View) pages/about | | toolbar | |
| 177 | + +---------+-------------+------+------------------------------+----------------+---------------+ |
| 178 | + |
| 179 | + |
| 180 | +测试 |
| 181 | +======= |
| 182 | + |
| 183 | +- **调试工具栏:** |
| 184 | + - 调试工具栏现在具有新的“热重载”功能,可以在文件更改时自动重新加载页面。 |
| 185 | + 请参阅 :ref:`debug-toolbar-hot-reload`。 |
| 186 | + - 现在,在 *Routes* 选项卡的 *DEFINED ROUTES* 中显示 :ref:`view-routes`。 |
| 187 | + |
| 188 | +数据库 |
| 189 | +======== |
| 190 | + |
| 191 | +- **MySQLi:** 在数据库配置中添加了 ``numberNative`` 属性,以保持 SQL 查询后获取的变量类型与数据库中设置的类型一致。 |
| 192 | + 请参阅 :ref:`Database Configuration <database-config-explanation-of-values>`。 |
| 193 | +- **SQLSRV:** 字段元数据现在包括 ``nullable``。请参阅 :ref:`db-metadata-getfielddata`。 |
| 194 | + |
| 195 | +模型 |
| 196 | +===== |
| 197 | + |
| 198 | +- 为实体添加了特殊的 getter/setter,以避免方法名称冲突。 |
| 199 | + 请参阅 :ref:`entities-special-getter-setter`。 |
| 200 | + |
| 201 | +库 |
| 202 | +========= |
| 203 | + |
| 204 | +- **Validation:** 添加了 ``Validation::getValidated()`` 方法,用于获取实际验证的数据。请参阅 :ref:`validation-getting-validated-data` 了解详细信息。 |
| 205 | +- **Images:** 现在可以使用选项 ``$quality`` 压缩 WebP 图像。 |
| 206 | +- **Uploaded Files:** 添加了 ``UploadedFiles::getClientPath()`` 方法,如果通过目录上传方式上传文件,则返回文件的 `full_path` 索引的值。 |
| 207 | +- **CURLRequest:** 添加了请求选项 ``proxy``。请参阅 :ref:`CURLRequest Class <curlrequest-request-options-proxy>`。 |
| 208 | +- **URI:** 添加了一个扩展了 ``URI`` 并表示站点 URI 的新 ``SiteURI`` 类。 |
| 209 | + |
| 210 | +辅助函数和方法 |
| 211 | +===================== |
| 212 | + |
| 213 | +- **Array:** 添加了 :php:func:`array_group_by()` 辅助函数,用于将数据值分组在一起。支持点符号语法。 |
| 214 | +- **Common:** :php:func:`force_https()` 不再终止应用程序,而是抛出 ``RedirectException``。 |
| 215 | + |
| 216 | +其他 |
| 217 | +====== |
| 218 | + |
| 219 | +- **DownloadResponse:** 添加了 ``DownloadResponse::inline()`` 方法,将 ``Content-Disposition: inline`` 标头设置为在浏览器中显示文件。 |
| 220 | + 请参阅 :ref:`open-file-in-browser` 了解详细信息。 |
| 221 | +- **View:** 在 ``renderSection()`` 上添加了可选的第二个参数 ``$saveData``,以防止在显示后自动清除数据。请参阅 :ref:`View Layouts <creating-a-layout>` 了解详细信息。 |
| 222 | +- **自动路由(改进):** |
| 223 | + - 现在你可以路由到模块。请参阅 :ref:`auto-routing-improved-module-routing` 了解详细信息。 |
| 224 | + - 如果找到与 URI 段对应的控制器,并且该控制器没有为该 URI 段定义的方法,则将执行默认方法。这样可以更灵活地处理自动路由中的 URI。请参阅 :ref:`controller-default-method-fallback` 了解详细信息。 |
| 225 | +- **过滤器:** 现在可以在 :ref:`$filters 属性 <filters-filters-filter-arguments>` 中使用过滤器参数。 |
| 226 | +- **请求:** 添加了 ``IncomingRequest::setValidLocales()`` 方法,用于设置有效的区域设置。 |
| 227 | +- **Table:** 添加了 ``Table::setSyncRowsWithHeading()`` 方法,用于将行列与标题同步。请参阅 :ref:`table-sync-rows-with-headings` 了解详细信息。 |
| 228 | +- **错误处理:** 现在可以使用 :ref:`custom-exception-handlers`。 |
| 229 | +- **RedirectException:** |
| 230 | + - 它还可以接受实现 ``ResponseInterface`` 的对象作为第一个参数。 |
| 231 | + - 它实现了 ``ResponsableInterface``。 |
| 232 | +- **Factories:** |
| 233 | + - 现在可以定义实际加载的类名。请参阅 :ref:`factories-defining-classname-to-be-loaded`。 |
| 234 | + - 实现了配置缓存。请参阅 :ref:`factories-config-caching` 了解详细信息。 |
| 235 | + |
| 236 | +消息更改 |
| 237 | +*************** |
| 238 | + |
| 239 | +- 添加了 ``Core.invalidDirectory`` 错误消息。 |
| 240 | +- 改进了 ``HTTP.invalidHTTPProtocol`` 错误消息。 |
| 241 | + |
| 242 | +变更 |
| 243 | +******* |
| 244 | + |
| 245 | +- **Images:** 在 ``GDHandler`` 中,WebP 的默认质量从 80 改为 90。 |
| 246 | +- **Config:** |
| 247 | + - 删除了 **app/Config/App.php** 中已弃用的 Cookie 项。 |
| 248 | + - 删除了 **app/Config/App.php** 中已弃用的 Session 项。 |
| 249 | + - 删除了 **app/Config/App.php** 中已弃用的 CSRF 项。 |
| 250 | + - 将路由设置移至 **app/Config/Routing.php** 配置文件。 |
| 251 | + 请参阅 :ref:`Upgrading Guide <upgrade-440-config-routing>`。 |
| 252 | +- **DownloadResponse:** 在生成响应标头时,如果之前已指定了 ``Content-Disposition`` 标头,则不替换它。 |
| 253 | +- **自动加载器:** |
| 254 | + - 在 v4.4.0 之前,CodeIgniter 的自动加载器不允许在某些操作系统上的文件名中使用特殊字符。 |
| 255 | + 可以使用的符号是 ``/``、``_``、``.``、``:``、``\`` 和空格。 |
| 256 | + 因此,如果你将 CodeIgniter 安装在包含特殊字符(如 ``(``、``)`` 等)的文件夹中,CodeIgniter 将无法工作。 |
| 257 | + 从 v4.4.0 开始,此限制已被移除。 |
| 258 | + - ``Autoloader::loadClass()`` 和 ``Autoloader::loadClassmap()`` 方法现在都标记为 ``@internal``。 |
| 259 | +- **RouteCollection:** 受保护属性 ``$routes`` 的数组结构已进行了修改以提高性能。 |
| 260 | +- **HSTS:** 现在,无论是通过 :php:func:`force_https()` 还是 ``Config\App::$forceGlobalSecureRequests = true``,都会设置 HTTP 状态码 307,允许在重定向后保留 HTTP 请求方法。 |
| 261 | + 在之前的版本中,它是 302。 |
| 262 | + |
| 263 | +弃用 |
| 264 | +************ |
| 265 | + |
| 266 | +- **Entity:** 弃用了 ``Entity::setAttributes()`` 方法。请改用 ``Entity::injectRawData()``。 |
| 267 | +- **错误处理:** 弃用了 ``CodeIgniter\Debug\Exceptions`` 中的许多方法和属性。因为这些方法已移至 ``BaseExceptionHandler`` 或 ``ExceptionHandler``。 |
| 268 | +- **自动加载器:** 弃用了 ``Autoloader::sanitizeFilename()``。 |
| 269 | +- **CodeIgniter:** |
| 270 | + - 弃用了 ``CodeIgniter::$returnResponse`` 属性。不再使用。 |
| 271 | + - 弃用了 ``CodeIgniter::$cacheTTL`` 属性。不再使用。请改用 ``ResponseCache``。 |
| 272 | + - 弃用了 ``CodeIgniter::cache()`` 方法。不再使用。请改用 ``ResponseCache``。 |
| 273 | + - 弃用了 ``CodeIgniter::cachePage()`` 方法。不再使用。请改用 ``ResponseCache``。 |
| 274 | + - 弃用了 ``CodeIgniter::generateCacheName()`` 方法。不再使用。请改用 ``ResponseCache``。 |
| 275 | + - 弃用了 ``CodeIgniter::callExit()`` 方法。不再使用。 |
| 276 | +- **RedirectException:** 弃用了 ``\CodeIgniter\Router\Exceptions\RedirectException``。请改用 ``\CodeIgniter\HTTP\Exceptions\RedirectException``。 |
| 277 | +- **Session:** 弃用了 ``Session`` 中的属性 ``$sessionDriverName``、``$sessionCookieName``、 |
| 278 | + ``$sessionExpiration``、``$sessionSavePath``、``$sessionMatchIP``、 |
| 279 | + ``$sessionTimeToUpdate`` 和 ``$sessionRegenerateDestroy``,不再使用。请改用 ``$config``。 |
| 280 | +- **Security:** 弃用了 ``Security`` 中的属性 ``$csrfProtection``、``$tokenRandomize``、 |
| 281 | + ``$tokenName``、``$headerName``、``$expires``、``$regenerate`` 和 |
| 282 | + ``$redirect``,不再使用。请改用 ``$config``。 |
| 283 | +- **URI:** |
| 284 | + - 弃用了 ``URI::$uriString``。 |
| 285 | + - 弃用了 ``URI::$baseURL``。请改用 ``SiteURI``。 |
| 286 | + - 弃用了 ``URI::setSilent()``。 |
| 287 | + - 弃用了 ``URI::setScheme()``。请改用 ``withScheme()``。 |
| 288 | + - 弃用了 ``URI::setURI()``。 |
| 289 | + |
| 290 | +- **IncomingRequest:** |
| 291 | + - 弃用了 ``IncomingRequest::detectURI()``,不再使用。 |
| 292 | + - 弃用了 ``IncomingRequest::detectPath()``,不再使用。已移至 ``SiteURIFactory``。 |
| 293 | + - 弃用了 ``IncomingRequest::parseRequestURI()``,不再使用。已移至 ``SiteURIFactory``。 |
| 294 | + - 弃用了 ``IncomingRequest::parseQueryString()``,不再使用。已移至 ``SiteURIFactory``。 |
| 295 | + - 弃用了 ``IncomingRequest::setPath()``。 |
| 296 | + |
| 297 | +已修复的错误 |
| 298 | +************ |
| 299 | + |
| 300 | +- **自动路由(改进):** 在之前的版本中,当 ``$translateURIDashes`` 为 true 时,两个 URI 对应于单个控制器方法,一个 URI 用于破折号(例如 **foo-bar**),另一个 URI 用于下划线(例如 **foo_bar**)。修复了此错误。现在,下划线的 URI(**foo_bar**)无法访问。 |
| 301 | +- **输出缓冲:** 修复了输出缓冲的错误。 |
| 302 | +- **ControllerTestTrait:** ``ControllerTestTrait::withUri()`` 使用 URI 创建一个新的 Request 实例。因为 Request 实例应该具有 URI 实例。此外,如果 URI 字符串中的主机名与 ``Config\App`` 中的有效主机名不匹配,则将设置有效的主机名。 |
| 303 | + |
| 304 | +有关修复的所有错误的完整列表,请参阅存储库的 `CHANGELOG.md <https://github.com/codeigniter4/CodeIgniter4/blob/develop/CHANGELOG.md>`_。 |
0 commit comments