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

以下のファイルに大きな変更が加えられました。**更新されたバージョンをアプリケーションにマージする必要があります**

重要

上記のファイルを更新しないと、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** ファイルは、設定や冗長な記述なしでルートのみを含むように簡素化されました。

  • 環境固有のルートファイルは自動的にロードされなくなりました。

そのため、以下の手順が必要です。

  1. 新しいフレームワークから **app/Config/Routing.php** を **app/Config** ディレクトリにコピーし、設定します。

  2. **app/Config/Routes.php** 内で不要になった設定をすべて削除します。

  3. 環境固有のルートファイルを使用する場合は、**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 設定項目は使用されなくなりました。

  1. 新しいフレームワークから **app/Config/Security.php** を **app/Config** ディレクトリにコピーし、設定します。

  2. **app/Config/App.php** のプロパティ ($CSRFTokenName から $CSRFSameSite まで) を削除します。

app/Config/Session.php

**app/Config/App.php** のセッション設定項目は使用されなくなりました。

  1. 新しいフレームワークから **app/Config/Session.php** を **app/Config** ディレクトリにコピーし、設定します。

  2. **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