从 4.3.8 升级到 4.4.0
请参考与您的安装方法相对应的升级说明。
安全
使用 $this->validate() 时
在控制器中,$this->validate() 存在已知的潜在漏洞,可能绕过验证。攻击者可以利用此漏洞将未验证的空数据误认为已验证数据,并继续进行处理。
已添加 Validation::getValidated() 方法以确保获取已验证的数据。
因此,在控制器中使用 $this->validate()
时,应使用新的 Validation::getValidated()
方法获取已验证的数据。
// In Controller.
if (! $this->validate([
'username' => 'required',
'password' => 'required|min_length[10]',
])) {
// The validation failed.
return view('login', [
'errors' => $this->validator->getErrors(),
]);
}
// The validation was successful.
// Get the validated data.
$validData = $this->validator->getValidated();
重大变更
URI::setSegment() 变更
由于一个 bug,在之前的版本中,如果指定了最后一个段 +2
,则不会抛出异常。此 bug 现已修复。
如果您的代码依赖于此 bug,请修复段号。
// URI: http://example.com/one/two
// Before:
$uri->setSegment(4, 'three');
// The URI will be http://example.com/one/two/three
// After:
$uri->setSegment(4, 'three'); // Will throw Exception
$uri->setSegment(3, 'three');
// The URI will be http://example.com/one/two/three
站点 URI 变更
由于当前 URI 确定机制的重构,框架可能返回的站点 URI 或 URI 路径与之前的版本略有不同。这可能会破坏您的测试代码。如果现有测试失败,请更新断言。
当您的 baseURL 包含子目录,并且您使用
URI::getPath()
方法获取当前 URI 相对于 baseURL 的相对路径时,必须使用新的SiteURI::getRoutePath()
方法。
有关详细信息,请参阅 站点 URI 变更。
扩展异常时
如果您正在扩展 CodeIgniter\Debug\Exceptions
并且没有覆盖 exceptionHandler()
方法,则在您的 app/Config/Exceptions.php 中定义新的 Config\Exceptions::handler()
方法将导致执行指定的异常处理程序。
您的覆盖代码将不再执行,因此请通过定义您自己的异常处理程序进行必要的更改。
有关详细信息,请参见 自定义异常处理程序。
自动路由(改进)和 translateURIDashes
当使用自动路由(改进)并且 $translateURIDashes
为 true($routes->setTranslateURIDashes(true)
)时,在以前的版本中,由于一个错误,两个 URI 对应一个控制器方法,一个 URI 用于连字符(例如,foo-bar),另一个 URI 用于下划线(例如,foo_bar)。
此错误已修复,现在无法访问下划线 URI(foo_bar)。
如果您有指向下划线 URI(foo_bar)的链接,请使用连字符 URI(foo-bar)更新它们。
将类名与命名空间传递给工厂
将类名与命名空间传递给工厂的行为已更改。有关详细信息,请参见 变更日志。
如果您有类似 model(\Myth\Auth\Models\UserModel::class)
或 model('Myth\Auth\Models\UserModel')
的代码(代码可能在第三方包中),并且您希望加载 App\Models\UserModel
,您需要在第一次加载该类之前定义要加载的类名。
Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel');
有关详细信息,请参见 定义要加载的类名。
接口更改
已进行一些接口更改。实现它们的类应更新其 API 以反映这些更改。有关详细信息,请参见 接口更改。
方法签名更改
已进行一些方法签名更改。扩展它们的类应更新其 API 以反映这些更改。有关详细信息,请参见 方法签名更改。
此外,一些构造函数和 Services::security()
的参数类型已更改。如果您使用参数调用它们,请更改参数值。有关详细信息,请参见 参数类型更改。
RouteCollection::$routes
受保护属性 $routes
的数组结构已为性能而修改。
如果您扩展了 RouteCollection
并使用了 $routes
,请更新您的代码以匹配新的数组结构。
强制文件更改
index.php 和 spark
以下文件进行了重大更改,您必须将更新后的版本与您的应用程序合并。
public/index.php
(另请参见 CodeIgniter 和 exit())spark
重要
如果您不更新上述文件,CodeIgniter 在运行 composer update
后将无法正常工作。
例如,升级过程如下
composer update
cp vendor/codeigniter4/framework/public/index.php public/index.php
cp vendor/codeigniter4/framework/spark spark
配置文件
app/Config/App.php
属性 $proxyIPs
必须是数组。如果您不使用代理服务器,它必须是 public array $proxyIPs = [];
。
app/Config/Routing.php
为了清理路由系统,进行了以下更改
新的 app/Config/Routing.php 文件,用于保存以前在 Routes 文件中的设置。
app/Config/Routes.php 文件已简化,因此它只包含路由,没有设置和冗长的文字来使文件混乱。
环境特定的路由文件不再自动加载。
因此您需要执行以下操作
将 app/Config/Routing.php 从新框架复制到您的 app/Config 目录,并进行配置。
删除 app/Config/Routes.php 中不再需要的全部设置。
如果您使用环境特定的路由文件,请将它们添加到 app/Config/Routing.php 中的
$routeFiles
属性中。
app/Config/Toolbar.php
您需要添加新的属性 $watchedDirectories
和 $watchedExtensions
用于 热重载
--- a/app/Config/Toolbar.php
+++ b/app/Config/Toolbar.php
@@ -88,4 +88,31 @@ class Toolbar extends BaseConfig
* `$maxQueries` defines the maximum amount of queries that will be stored.
*/
public int $maxQueries = 100;
+
+ /**
+ * --------------------------------------------------------------------------
+ * Watched Directories
+ * --------------------------------------------------------------------------
+ *
+ * Contains an array of directories that will be watched for changes and
+ * used to determine if the hot-reload feature should reload the page or not.
+ * We restrict the values to keep performance as high as possible.
+ *
+ * NOTE: The ROOTPATH will be prepended to all values.
+ */
+ public array $watchedDirectories = [
+ 'app',
+ ];
+
+ /**
+ * --------------------------------------------------------------------------
+ * Watched File Extensions
+ * --------------------------------------------------------------------------
+ *
+ * Contains an array of file extensions that will be watched for changes and
+ * used to determine if the hot-reload feature should reload the page or not.
+ */
+ public array $watchedExtensions = [
+ 'php', 'css', 'js', 'html', 'svg', 'json', 'env',
+ ];
}
app/Config/Events.php
您需要添加代码以添加 热重载 的路由。
--- a/app/Config/Events.php
+++ b/app/Config/Events.php
@@ -4,6 +4,7 @@ namespace Config;
use CodeIgniter\Events\Events;
use CodeIgniter\Exceptions\FrameworkException;
+use CodeIgniter\HotReloader\HotReloader;
/*
* --------------------------------------------------------------------
@@ -44,5 +45,11 @@ Events::on('pre_system', static function () {
if (CI_DEBUG && ! is_cli()) {
Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect');
Services::toolbar()->respond();
+ // Hot Reload route - for framework use on the hot reloader.
+ if (ENVIRONMENT === 'development') {
+ Services::routes()->get('__hot-reload', static function () {
+ (new HotReloader())->run();
+ });
+ }
}
});
app/Config/Security.php
app/Config/App.php 中的 CSRF 配置项不再使用。
将新框架中的 app/Config/Security.php 复制到您的 app/Config 目录,并进行配置。
删除 app/Config/App.php 中的属性(从
$CSRFTokenName
到$CSRFSameSite
)。
app/Config/Session.php
app/Config/App.php 中的 Session 配置项不再使用。
将新框架中的 app/Config/Session.php 复制到您的 app/Config 目录,并进行配置。
删除 app/Config/App.php 中的属性(从
$sessionDriver
到$sessionDBGroup
)。
重大增强
路由:
RouteCollection::__construct()
的方法签名已更改。添加了第三个参数Routing $routing
。扩展类也应该添加参数,以免破坏 LSP。验证:
Validation::check()
的方法签名已更改。删除了$rule
参数上的string
类型提示。扩展类也应该删除类型提示,以免破坏 LSP。
项目文件
项目空间(根目录、app、public、writable)中的一些文件已更新。由于这些文件位于系统范围之外,因此不会在没有您的干预的情况下更改。
有一些第三方 CodeIgniter 模块可用于帮助合并对项目空间的更改:在 Packagist 上探索。
内容变更
以下文件进行了重大更改(包括弃用或视觉调整),建议您将更新版本与您的应用程序合并。
配置
- app/Config/CURLRequest.php
$shareOptions 的默认值已更改为
false
。
- app/Config/Exceptions.php
添加了新方法
handler()
,用于定义自定义异常处理程序。请参阅 自定义异常处理程序。
所有变更
这是 **项目空间** 中所有已更改文件的列表;其中许多只是简单的注释或格式更改,不会影响运行时。
app/Config/App.php
app/Config/CURLRequest.php
app/Config/Cookie.php
app/Config/Database.php
app/Config/Events.php
app/Config/Exceptions.php
app/Config/Filters.php
app/Config/Routes.php
app/Config/Routing.php
app/Config/Toolbar.php
public/index.php
spark