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() の変更
バグのため、以前のバージョンでは、最後のセグメント +2
が指定されている場合、例外がスローされませんでした。このバグは修正されました。
コードがこのバグに依存している場合は、セグメント番号を修正してください。
// 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)
) の場合、以前のバージョンではバグにより、2 つの URI が単一のコントローラーメソッドに対応していました。1 つはダッシュの URI (例:**foo-bar**)、もう 1 つはアンダースコアの 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
パフォーマンス向上のため、protected プロパティ $routes
の配列構造が変更されました。
RouteCollection
を拡張し、$routes
を使用する場合は、新しい配列構造に合わせてコードを更新してください。
必須ファイル変更
index.php と spark
以下のファイルに大きな変更が加えられました。**更新されたバージョンをアプリケーションにマージする必要があります**
public/index.php
(CodeIgniter と exit() も参照)spark
重要
上記のファイルを更新しないと、composer update
を実行した後、CodeIgniter は正しく動作しません。
アップグレード手順は、例えば以下のとおりです。
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
ルーティングシステムをクリーンアップするために、以下の変更が行われました。
以前は Routes ファイルにあった設定を保持する新しい **app/Config/Routing.php** ファイル。
**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** のセッション設定項目は使用されなくなりました。
新しいフレームワークから **app/Config/Session.php** を **app/Config** ディレクトリにコピーし、設定します。
**app/Config/App.php** のプロパティ (
$sessionDriver
から$sessionDBGroup
まで) を削除します。
破壊的変更を含む機能強化
**ルーティング:**
RouteCollection::__construct()
のメソッドシグネチャが変更されました。3 番目のパラメータRouting $routing
が追加されました。拡張クラスも同様にパラメータを追加して、LSP を壊さないようにする必要があります。**バリデーション:**
Validation::check()
のメソッドシグネチャが変更されました。$rule
パラメータのstring
型ヒントが削除されました。拡張クラスも同様に型ヒントを削除して、LSP を壊さないようにする必要があります。
プロジェクトファイル
**プロジェクトスペース** (root、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