4.2.12から4.3.0へのアップグレード

お使いのインストール方法に対応するアップグレード手順を参照してください。

Composerのバージョン

重要

Composerを使用している場合、CodeIgniter v4.3.0にはComposer 2.0.14以降が必要です。

古いバージョンのComposerを使用している場合は、composerツールをアップグレードし、vendor/ ディレクトリを削除して、再度composer updateを実行してください。

たとえば、手順は次のとおりです

composer self-update
rm -rf vendor/
composer update

必須ファイル変更

spark

次のファイルには大幅な変更が加えられており、更新されたバージョンをアプリケーションとマージする必要があります

  • spark

重要

このファイルを更新しないと、composer updateの実行後、Sparkコマンドがまったく機能しません。

たとえば、アップグレード手順は次のとおりです

composer update
cp vendor/codeigniter4/framework/spark .

設定ファイル

app/Config/Kint.php

  • app/Config/Kint.php は、Kint 5.0用に更新されました。

  • 次のように置き換える必要があります

    • Kint\Renderer\RendererKint\Renderer\AbstractRenderer

    • Renderer::SORT_FULLAbstractRenderer::SORT_FULL

app/Config/Exceptions.php

  • PHP 8.2を使用している場合は、新しいプロパティ $logDeprecations および $deprecationLogLevel を追加する必要があります。

モック設定クラス

  • テストで次のモック設定クラスを使用している場合は、app/Config の対応する設定ファイルを更新する必要があります

    • MockAppConfig (Config\App)

    • MockCLIConfig (Config\App)

    • MockSecurityConfig (Config\Security)

  • これらの設定クラスのプロパティに types を追加します。プロパティ型に合わせてプロパティ値を修正する必要がある場合があります。

composer.json

CodeIgniterを手動でインストールし、Composerを使用している場合は、次の行を削除して、composer updateを実行する必要があります。

{
    ...
    "require": {
        ...
        "kint-php/kint": "^4.2",  <-- Remove this line
        ...
    },
    ...
    "scripts": {
        "post-update-cmd": [
            "CodeIgniter\\ComposerScripts::postUpdate"  <-- Remove this line
        ],
        "test": "phpunit"
    },
    ...
}

破壊的な変更

データベース例外の変更

  • データベースエラーが発生した場合、例外クラスが変更される可能性があります。例外をキャッチする場合は、コードが例外をキャッチできることを確認する必要があります。

  • CI_DEBUG が false の場合でも、いくつかの例外がスローされるようになりました。

  • トランザクション中、DBDebug が true の場合でも、デフォルトでは例外はスローされません。例外をスローさせたい場合は、transException(true) を呼び出す必要があります。「例外のスロー」を参照してください。

  • 詳しくは、「データベースエラー発生時の例外」を参照してください。

キャッチされなかった例外のHTTPステータスコードと終了コード

  • 例外コードHTTPステータスコード として期待している場合、HTTPステータスコードが変更されます。その場合は、例外で HTTPExceptionInterface を実装する必要があります。「例外でHTTPステータスコードを指定する」を参照してください。

  • 例外コード に基づいて 終了コード を期待している場合、終了コードが変更されます。その場合は、例外で HasExitCodeInterface を実装する必要があります。「例外で終了コードを指定する」を参照してください。

redirect()->withInput()とバリデーションエラー

redirect()->withInput() とバリデーションエラーには、文書化されていない動作がありました。withInput() でリダイレクトする場合、CodeIgniterはセッションにバリデーションエラーを保存し、リダイレクトされたページのバリデーションオブジェクトから (新しいバリデーションが実行される前に) エラーを取得できます。

// In the controller
if (! $this->validate($rules)) {
    return redirect()->back()->withInput();
}

// In the view of the redirected page
<?= service('Validation')->listErrors() ?>

この動作はバグであり、v4.3.0で修正されました。

バグに依存するコードがある場合は、コードを変更する必要があります。バリデーションオブジェクトの代わりに、新しいフォームヘルパー、validation_errors()validation_list_errors()、および validation_show_error() を使用して、バリデーションエラーを表示します。

バリデーションの変更

  • ValidationInterface が変更されました。実装されたクラスも同様に、LSPを壊さないようにメソッドとパラメータを追加する必要があります。詳細については、バリデーションの変更を参照してください。

  • Validation::loadRuleGroup() の戻り値が、$group が空の場合に null から [] に変更されました。この動作に依存している場合は、コードを更新してください。

時間の修正

  • バグ修正により、Time の一部のメソッドが可変の動作から不変の動作に変更されました。TimeDateTimeImmutable を継承するようになりました。詳細については、変更履歴を参照してください。

  • 変更前の Time の動作が必要な場合は、互換性のある TimeLegacy クラスが追加されました。アプリケーションコード内のすべての TimeTimeLegacy に置き換えてください。

  • ただし、TimeLegacy は非推奨です。したがって、コードを更新することをお勧めします。

例:

// Before
$time = Time::now();
// ...
if ($time instanceof DateTime) {
    // ...
}

// After
$time = Time::now();
// ...
if ($time instanceof DateTimeInterface) {
    // ...
}
// Before
$time1 = new Time('2022-10-31 12:00');
$time2 = $time1->modify('+1 day');
echo $time1; // 2022-11-01 12:00:00
echo $time2; // 2022-11-01 12:00:00

// After
$time1 = new Time('2022-10-31 12:00');
$time2 = $time1->modify('+1 day');
echo $time1; // 2022-10-31 12:00:00
echo $time2; // 2022-11-01 12:00:00

テストでの STDERR および STDOUT ストリームのキャプチャ

エラーおよび出力ストリームのキャプチャ方法が変更されました。現在は、以下の代わりに

use CodeIgniter\Test\Filters\CITestStreamFilter;

protected function setUp(): void
{
    CITestStreamFilter::$buffer = '';
    $this->streamFilter         = stream_filter_append(STDOUT, 'CITestStreamFilter');
    $this->streamFilter         = stream_filter_append(STDERR, 'CITestStreamFilter');
}

protected function tearDown(): void
{
    stream_filter_remove($this->streamFilter);
}

以下を使用する必要があります。

use CodeIgniter\Test\Filters\CITestStreamFilter;

protected function setUp(): void
{
    CITestStreamFilter::registration();
    CITestStreamFilter::addOutputFilter();
    CITestStreamFilter::addErrorFilter();
}

protected function tearDown(): void
{
    CITestStreamFilter::removeOutputFilter();
    CITestStreamFilter::removeErrorFilter();
}

または、トレイト CodeIgniter\Test\StreamFilterTrait を使用します。詳細については、CLI出力のテストを参照してください。

インターフェースの変更

いくつかのインターフェースが修正されました。詳細については、インターフェースの変更を参照してください。

外部キーデータ

  • BaseConnection::getForeignKeyData() によって返されるデータ構造が変更されました。このメソッドに依存するコードは、新しい構造を使用するように調整する必要があります。

例: tableprefix_table_column1_column2_foreign

返されるデータは、次の構造を持ちます。

/**
 * @return array[
 *    {constraint_name} =>
 *        stdClass[
 *            'constraint_name'     => string,
 *            'table_name'          => string,
 *            'column_name'         => string[],
 *            'foreign_table_name'  => string,
 *            'foreign_column_name' => string[],
 *            'on_delete'           => string,
 *            'on_update'           => string,
 *            'match'               => string
 *        ]
 * ]
 */

破壊的な拡張

複数ドメインのサポート

  • Config\App::$allowedHostnames を設定した場合、base_url(), current_url(), site_url() などの URL 関連の関数は、現在の URL が一致する場合、Config\App::$allowedHostnames に設定されたホスト名を含む URL を返します。

データベース

  • CodeIgniter\Database\Database::loadForge() の戻り値の型が Forge に変更されました。拡張クラスも同様に型を変更する必要があります。

  • CodeIgniter\Database\Database::loadUtils() の戻り値の型が BaseUtils に変更されました。拡張クラスも同様に型を変更する必要があります。

  • BaseBuilder::updateBatch() の2番目のパラメータ $index$constraints に変更されました。配列、文字列、または RawSql の型を受け入れるようになりました。拡張クラスも同様に型を変更する必要があります。

  • BaseBuilder::insertBatch() および BaseBuilder::updateBatch()$set パラメータは、単一行のデータオブジェクトを受け入れるようになりました。拡張クラスも同様に型を変更する必要があります。

  • BaseBuilder::_updateBatch() の3番目のパラメータ $index$values に変更され、パラメータの型が array に変更されました。拡張クラスも同様に型を変更する必要があります。

  • Model::update() メソッドは、WHERE句なしでSQLステートメントを生成した場合、DatabaseException を発生させるようになりました。テーブル内のすべてのレコードを更新する必要がある場合は、代わりにQuery Builderを使用してください。例: $model->builder()->update($data)

ハニーポットとCSP

CSPが有効になっている場合、ハニーポットフィールドのコンテナタグに `id="hpc"` 属性が注入され、フィールドが非表示になります。ビューでこのIDが既に使用されている場合は、Config\Honeypot::$containerId で変更する必要があります。また、Config\Honeypot::$containerstyle="display:none" を削除できます。

その他

  • ヘルパー: html_helperform_helper、または一般的な関数内の void HTML 要素(例: <input>)がデフォルトでHTML5互換になるように変更され、XHTMLと互換性を持たせる必要がある場合は、 **app/Config/DocTypes.php** の $html5 プロパティを false に設定する必要があります。

  • CLI: Sparkコマンドの起動が CodeIgniter\CodeIgniter から抽出されたため、Services::codeigniter() サービスが上書きされている場合、これらのコマンドの実行に問題が発生する可能性があります。

プロジェクトファイル

プロジェクトスペース (ルート、app、public、writable) 内の多数のファイルが更新されました。これらのファイルは **system** スコープ外にあるため、ユーザーの介入なしに変更されることはありません。プロジェクトスペースへの変更のマージを支援する、いくつかのサードパーティ製CodeIgniterモジュールが利用可能です: Packagistで探索する

コンテンツの変更

以下のファイルは、重大な変更(非推奨や視覚的な調整を含む)を受けており、更新されたバージョンをアプリケーションにマージすることをお勧めします。

Config

  • app/Config/App.php
    • $baseURL のホスト名以外のサイトURLで許可されたホスト名を設定するために、新しいプロパティ $allowedHostnames が追加されました。複数ドメインのサポートを参照してください。

    • プロパティ $appTimezone が、夏時間の影響を受けないように UTC に変更されました。

  • app/Config/Autoload.php
    • ヘルパーを自動ロードするために、新しいプロパティ $helpers が追加されました。

  • app/Config/Database.php
  • app/Config/DocTypes.php
    • void HTML要素(例: <input>)の斜線 (/) 文字を削除するかどうかを決定するプロパティ $html5 が追加され、HTML5互換性のためにデフォルトで true に設定されました。

  • app/Config/Encryption.php
  • app/Config/Exceptions.php
    • 2つの追加のパブリックプロパティ $logDeprecations および $deprecationLogLevel が追加されました。詳細については、非推奨警告のロギングを参照してください。

  • app/Config/Honeypot.php
    • CSPが有効な場合にコンテナタグのid属性値を設定するための新しいプロパティ $containerId が追加されました。

    • プロパティ $template 値の input タグが、HTML5互換に変更されました。

  • app/Config/Logger.php
    • プロパティ $threshold が、production 環境以外では 9 に変更されました。

  • app/Config/Modules.php
    • パフォーマンス向上のため、Composerパッケージの自動検出を制限するために、新しいプロパティ $composerPackages が追加されました。

  • app/Config/Routes.php
    • Sparkコマンドの実行方法が変更されたため、フレームワークの内部ルートをロードする必要がなくなりました(SYSTEMPATH . 'Config/Routes.php')。

  • app/Config/Security.php
    • CSRFチェックが失敗した場合のリダイレクトを防ぐために、プロパティ$redirectの値をfalseに変更しました。これにより、CSRFエラーであることを認識しやすくするためです。

  • app/Config/Session.php
    • セッション設定を処理するために追加されました。

  • app/Config/Validation.php
    • デフォルトのバリデーションルールが、セキュリティ向上のため厳格なルールに変更されました。従来型ルールと厳格ルールを参照してください。

ビューファイル

以下のビューファイルが、HTML5互換のタグに変更されました。また、エラーメッセージはErrors言語ファイルで定義されるようになりました。

  • app/Views/errors/html/error_404.php

  • app/Views/errors/html/error_exception.php

  • app/Views/errors/html/production.php

  • app/Views/welcome_message.php

すべての変更

これは、プロジェクト空間内で変更されたすべてのファイルのリストです。多くは、ランタイムに影響を与えない単純なコメントやフォーマット変更です。Configクラス内のすべてのプリミティブ型プロパティは型付けされています。

  • app/Config/App.php

  • app/Config/Autoload.php

  • app/Config/CURLRequest.php

  • app/Config/Cache.php

  • app/Config/ContentSecurityPolicy.php

  • app/Config/Cookie.php

  • app/Config/Database.php

  • app/Config/DocTypes.php

  • app/Config/Email.php

  • app/Config/Encryption.php

  • app/Config/Exceptions.php

  • app/Config/Feature.php

  • app/Config/Filters.php

  • app/Config/Format.php

  • app/Config/Generators.php

  • app/Config/Honeypot.php

  • app/Config/Images.php

  • app/Config/Kint.php

  • app/Config/Logger.php

  • app/Config/Migrations.php

  • app/Config/Mimes.php

  • app/Config/Modules.php

  • app/Config/Pager.php

  • app/Config/Paths.php

  • app/Config/Routes.php

  • app/Config/Security.php

  • app/Config/Session.php

  • app/Config/Toolbar.php

  • app/Config/UserAgents.php

  • app/Config/Validation.php

  • app/Views/errors/html/error_404.php

  • app/Views/errors/html/error_exception.php

  • app/Views/errors/html/production.php

  • app/Views/welcome_message.php

  • composer.json

  • env

  • phpunit.xml.dist

  • spark