版本 4.2.0
发布日期:2022 年 6 月 3 日
CodeIgniter4 的 4.2.0 版本
亮点
将最小 PHP 要求更新为 7.4。
为了使默认配置更安全,自动路由已默认禁用。
查询构建器 子查询 和 UNION 支持(由 Andrey Pyzhikov 贡献)。参见 数据库.
新贡献者
@fdomgjoni99 在 #5608 中做出了他们的第一次贡献。
@beganovich 在 #5823 中做出了他们的第一次贡献。
@michaelrk02 在 #5878 中做出了他们的第一次贡献。
@valmorflores 在 #6051 中做出了他们的第一次贡献。
@lonnie-vault 在 #6060 中做出了他们的第一次贡献。
重大变更
方法签名变更
CodeIgniter\Database\BaseBuilder::join()
和CodeIgniter\Database\*\Builder::join()
的方法签名已更改。Validation::setRule()
的方法签名已更改。$rules
参数上的string
类型提示已删除。 扩展类也应删除该参数,以免破坏 LSP。CodeIgniter\CLI\CommandRunner::_remap()
的方法签名已更改以修复错误。Service::reset()
和CIUnitTestCase::resetServices()
的默认参数值已从false
更改为true
。 这样做是为了消除测试期间出现的意外问题,例如lang()
未获取翻译消息。
行为变更
CodeIgniter\CodeIgniter
类现在有一个新的属性$context
,它在运行时必须具有正确的上下文。因此,以下文件已更改public/index.php
spark
system/bootstrap.php
文件已修改,以便轻松实现 预加载。返回CodeIgniter
实例和加载.env
文件已移至index.php
和spark
。CodeIgniter\Autoloader\Autoloader::initialize()
已更改行为以修复一个错误。它以前仅在$modules->discoverInComposer
为 true 时才使用 Composer 类映射。现在,如果 Composer 可用,它始终使用 Composer 类映射。CLI::color() 输出的颜色代码已更改以修复一个错误。
为了防止从 Web 浏览器进行意外访问,如果将控制器添加到 CLI 路由 (
$routes->cli()
),则该控制器的所有方法将不再可以通过自动路由访问。对于扩展历史记录收集器的用户,可能存在向后兼容性问题,他们可能需要更新
History::setFiles()
方法。dot_array_search()
的意外行为已修复。现在dot_array_search('foo.bar.baz', ['foo' => ['bar' => 23]])
返回null
。以前的版本返回23
。已更改
CodeIgniter::storePreviousURL()
,使其仅存储 Content-Type 为text/html
的 URL。 这也影响了previous_url()
和redirect()->back()
的行为。
增强功能
新的改进自动路由
添加了一个可选的更安全的自动路由器。 以下是与传统自动路由的差异
- 控制器方法需要 HTTP 动词前缀,例如
getIndex()
、postCreate()
。 开发人员始终知道 HTTP 方法,因此意外 HTTP 方法的请求不会通过。
- 控制器方法需要 HTTP 动词前缀,例如
- 默认控制器(默认情况下为
Home
)和默认方法(默认情况下为index
)必须在 URI 中省略。 它限制了控制器方法和 URI 之间的一对一对应关系。
例如,默认情况下,您可以访问
/
,但/home
和/home/index
将返回 404 错误。
- 默认控制器(默认情况下为
- 它检查方法参数计数。
如果 URI 中的参数多于方法参数,则会导致 404 错误。
- 它不支持
_remap()
方法。 它限制了控制器方法和 URI 之间的一对一对应关系。
- 它不支持
- 无法访问已定义路由中的控制器。
它完全将可以通过 **自动路由** 访问的控制器与可以通过 **已定义路由** 访问的控制器分开。
有关详细信息,请参阅 自动路由(改进)。
数据库
- 添加了新的 OCI8 数据库驱动程序。
它可以访问 Oracle 数据库并支持 SQL 和 PL/SQL 语句。
- 原始 SQL 字符串支持
添加了类
CodeIgniter\Database\RawSql
,它表示原始 SQL 字符串。select()、where()、like()、join() 接受
CodeIgniter\Database\RawSql
实例。DBForge::addField()
默认值原始 SQL 字符串支持。请参阅 原始 SQL 字符串作为默认值。
SQLite3 具有一个新的配置项
foreignKeys
,它启用外键约束。
助手和函数
HTML 助手
script_tag()
现在使用null
值以最小化形式写入布尔属性:<script src="..." defer />
。请参阅script_tag()
的示例代码。在
get_filenames()
函数中添加了第四个参数$includeDir
。请查看get_filenames()
。- 通过
log_message()
记录的异常信息现在得到了改进。它现在包含了异常发生的源文件和行号。它也不再截断消息。 日志格式也发生了变化。如果用户在应用程序中依赖日志格式,新的日志格式为“<基于 1 的计数> <清理后的文件路径>(<行号>): <类><函数><参数>”
- 通过
命令
- 添加了
spark db:table
命令。有关详细信息,请查看 数据库命令。 - 您现在可以在终端中查看当前连接的数据库中的所有表名。
spark db:table --show
- 或者,您可以查看表的字段名和记录。
spark db:table my_table
spark db:table my_table --limit-rows 50 --limit-field-value 20 --desc
- 或者,您可以查看元数据,例如列类型、表的最大长度。
spark db:table my_table --metadata
- 添加了
spark routes
命令现在显示闭包路由、自动路由和过滤器。请查看 URI 路由。
其他
在 Controller 中添加了
$this->validateData()
。请查看 $this->validateData()。- 内容安全策略 (CSP) 增强
在
Config\ContentSecurityPolicy
中添加了配置$scriptNonceTag
和$styleNonceTag
,用于自定义 CSP 占位符 ({csp-script-nonce}
和{csp-style-nonce}
)在
Config\ContentSecurityPolicy
中添加了配置$autoNonce
来禁用 CSP 占位符替换。添加了函数
csp_script_nonce()
和csp_style_nonce()
来获取 nonce 属性。有关详细信息,请参阅 内容安全策略。
新的 视图装饰器 允许在缓存之前修改生成的 HTML。
添加了验证严格规则。请参阅 传统规则和严格规则。
在 app/Config/Mimes.php 中添加了对 webp 文件的支持。
RouteCollection::addRedirect()
现在可以使用占位符。有关详细信息,请参阅 重定向路由。- Debugbar 增强功能
调试工具栏现在使用
microtime()
而不是time()
。
添加了 预加载 的示例文件。请参阅 preload.php。
更改
将最小 PHP 要求更新为 7.4。
为了使默认配置更安全,自动路由已默认禁用。
验证。更改了使用带通配符 (*) 的字段时错误的生成方式。现在错误键包含完整路径。请参阅 获取所有错误。
使用通配符时,
Validation::getError()
将返回与掩码匹配的所有找到的错误,作为字符串。当前版本的 Content Security Policy (CSP) 为脚本和样式标签输出一个 nonce。以前版本为每个标签输出一个 nonce。
发送 cookie 的过程已移至
Response
类。现在Session
类不发送 cookie,而是将它们设置为 Response。
弃用
CodeIgniter\Database\SQLSRV\Connection::getError()
已弃用。请改用CodeIgniter\Database\SQLSRV\Connection::error()
。CodeIgniter\Debug\Exceptions::cleanPath()
和CodeIgniter\Debug\Toolbar\Collectors\BaseCollector::cleanPath()
已弃用。请改用clean_path()
函数。CodeIgniter\Log\Logger::cleanFilenames()
和CodeIgniter\Test\TestLogger::cleanup()
已被弃用。请使用clean_path()
函数代替。CodeIgniter\Router\Router::setDefaultController()
已被弃用。spark 中的常量
SPARKED
已被弃用。请使用CodeIgniter\CodeIgniter
中的$context
属性代替。CodeIgniter\Autoloader\Autoloader::discoverComposerNamespaces()
已被弃用,不再使用。常量
EVENT_PRIORITY_LOW
、EVENT_PRIORITY_NORMAL
和EVENT_PRIORITY_HIGH
已被弃用。请使用类常量CodeIgniter\Events\Events::PRIORITY_LOW
、CodeIgniter\Events\Events::PRIORITY_NORMAL
和CodeIgniter\Events\Events::PRIORITY_HIGH
代替。
已修复的错误
SQLSRV 驱动程序忽略了配置中的端口值。
有关已修复错误的完整列表,请参阅仓库的 CHANGELOG_4.2.md。