版本 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。