版本 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
如果您错误地传递了不存在的类名,以前的版本将返回 App
或 Config
命名空间中的类实例,因为 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
。数据库的
BaseHandler
、DatabaseHandler
、FileHandler
、MemcachedHandler
和RedisHandler
中__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
。
返回类型更改
自动加载器: loadClass 和 loadClassmap 方法的返回签名被设置为 void,以与 spl_autoload_register 和 spl_autoload_unregister 函数中的回调兼容。
增强功能
命令
测试
数据库
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
,以防止在显示后自动清除数据。有关详细信息,请参阅 视图布局。过滤器: 现在您可以使用 $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
中的许多方法和属性已弃用。因为这些方法已移至BaseExceptionHandler
或ExceptionHandler
。自动加载器:
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)不可访问。输出缓冲:修复了输出缓冲的错误。
ControllerTestTrait:
ControllerTestTrait::withUri()
使用 URI 创建一个新的 Request 实例。因为 Request 实例应该具有 URI 实例。此外,如果 URI 字符串中的主机名与Config\App
无效,则将设置有效主机名。
有关已修复错误的完整列表,请参阅仓库的 CHANGELOG.md。