バージョン 4.3.0

リリース日: 2023年1月10日

CodeIgniter4 の 4.3.0 リリース

ハイライト

  • QueryBuilder は、**upsert()**、**upsertBatch()**、**deleteBatch()** をサポートし、現在は **\*batch()** メソッドでクエリからのデータを設定できます(sclubricantsさんによる貢献)。QueryBuilder を参照してください。

  • Database Forge は、**既存のテーブルへのインデックスの追加** と **インデックスの名前付け** をサポートするようになりました(sclubricantsさんによる貢献)。Forge を参照してください。

  • デフォルトの設定をより安全にするため、デフォルトのバリデーションルールが **厳格なルール** に変更されました。

  • データベースエラーが発生した場合、例外がスローされる条件と、スローされる可能性のある例外クラスが変更されました。データベースエラー発生時の例外 を参照してください。

破壊的変更

動作の変更

データベースエラー発生時の例外

  • データベース接続クラスによってスローされる例外は、CodeIgniter\Database\Exceptions\DatabaseExceptionに変更されました。以前は、異なるデータベースドライバが異なる例外クラスをスローしていましたが、これらは DatabaseException に統一されました。

  • プリペアドクエリの execute() メソッドによってスローされる例外は、DatabaseException に変更されました。以前は、異なるデータベースドライバが異なる例外クラスをスローしたり、例外をスローしなかったりしていましたが、これらは DatabaseException に統一されました。

  • トランザクション中は、DBDebug が true でも、デフォルトでは例外はスローされません。

  • DBDebugCI_DEBUG の変更

    • 環境に関係なく動作を統一するために、Config\Database::$default['DBDebug']Config\Database::$tests['DBDebug'] はデフォルトで true に変更されました。これらの設定により、データベースエラーが発生すると常に例外がスローされます。以前は、**本番環境でのみ** false でした。

    • 現在、BaseBuilder でスローされる DatabaseException は、$DBDebug が true の場合にスローされます。以前は、CI_DEBUG が true の場合にスローされていました。

    • BaseConnection::$DBDebug のデフォルト値は true に変更されました。

    • これらの変更により、DBDebug は **エラー発生時に例外をスローするかどうかを意味するようになりました**。デバッグとは無関係ですが、名前は変更されていません。

    • DBDebugtrue の状態でトランザクションを実行する場合、クエリエラーが発生しても、デフォルトでは例外はスローされません。以前は、クエリエラーが発生すると、すべてのクエリがロールバックされ、例外がスローされていたため、エラーの管理 または トランザクションの手動実行 は機能しませんでした。

    • 現在、Model で WHERE 句なしで削除を実行すると、CI_DEBUG が false でも DatabaseException がスローされます。以前は、CI_DEBUG が true の場合にスローされていました。

例外発生時のHTTPステータスコードと終了コード

以前、CodeIgniter の例外ハンドラーは、場合によっては *例外コード* を *HTTPステータスコード* として使用し、例外コードに基づいて *終了コード* を計算していました。しかし、例外コードと HTTP ステータスコードまたは終了コードには論理的な接続がありません。

  • 現在、例外ハンドラーは HTTP ステータスコードを 500 に設定し、終了コードを定数 EXIT_ERROR (= 1) にデフォルトで設定します。

  • 例外クラスに HTTPExceptionInterface または HasExitCodeInterface を実装することで、HTTP ステータスコードまたは終了コードを変更できます。例外で HTTP ステータスコードを指定する例外で終了コードを指定する を参照してください。

たとえば、終了コードは次のように変更されました。

  • キャッチされない ConfigException が発生した場合、終了コードは 12 ではなく EXIT_CONFIG (= 3) になります。

  • キャッチされない CastException が発生した場合、終了コードは 9 ではなく EXIT_CONFIG (= 3) になります。

  • キャッチされない DatabaseException が発生した場合、終了コードは 17 ではなく EXIT_DATABASE (= 8) になります。

時間

Time クラスの以下のメソッドには、現在のオブジェクトの状態を変更するバグがありました。これらのバグを修正するために、Time クラスが修正されました。

  • add()

  • modify()

  • setDate()

  • setISODate()

  • setTime()

  • sub()

  • 現在、Time クラスは DateTimeImmutable を拡張し、完全にイミュータブルです。

  • 下位互換性のために、修正されていない Time クラスと同じ動作をする TimeLegacy クラスが追加されました。

その他

  • **ヘルパー:** script_tag()safe_mailto() は、<script> タグに type="text/javascript" を出力しなくなりました。

  • CLI: Sparkコマンドの処理変更に伴い、sparkファイルが変更されました。

  • CLI: CITestStreamFilter::$buffer = '' は、ストリームをリスンするフィルタの登録には、もはや影響しません。 現在は CITestStreamFilter::registration() メソッドを使用します。詳細はテストにおけるSTDERRとSTDOUTストリームのキャプチャ を参照してください。

  • データベース: BaseBuilder::_whereIn() 内の LogicException の一種である InvalidArgumentException は、設定によって抑制されなくなりました。以前は、CI_DEBUG が false の場合、例外が抑制されていました。

  • データベース: BaseConnection::getForeignKeyData() が返すデータ構造が変更されました。

  • データベース: CodeIgniter\Database\BasePreparedQuery クラスは、書き込みタイプのクエリに対して、Result クラスオブジェクトではなく、bool値を返すようになりました。

  • モデル: Model::update() メソッドは、WHERE句のないSQL文を生成した場合、DatabaseException を発生させるようになりました。モデルは、すべてのレコードを更新する操作をサポートしていません。

  • ルーティング: RouteCollection::resetRoutes() は、ルートの自動検出をリセットします。以前は、一度検出されると、RouteCollection::resetRoutes() が呼び出されても、RouteCollectionはルートファイルを再度検出することはありませんでした。

インターフェースの変更

注記

関連するCodeIgniterコアクラスを拡張したり、これらのインターフェースを実装していない限り、これらの変更はすべて下位互換性があり、介入は必要ありません。

OutgoingRequestInterface

  • 発信リクエストを表す新しいOutgoingRequestInterfaceを追加しました。

  • OutgoingRequestInterfaceを実装する新しいOutgoingRequestクラスを追加しました。

  • 現在、RequestInterfaceOutgoingRequestInterfaceを拡張しています。

  • 現在、CURLRequestOutgoingRequestを拡張しています。

  • 現在、RequestOutgoingRequestを拡張しています。

その他

  • HTTP: MessageInterface に欠けていた getProtocolVersion()getBody()hasHeader()getHeaderLine() メソッドを追加しました。

  • HTTP: 現在、ResponseInterfaceMessageInterfaceを拡張しています。

  • HTTP: 欠けていた ResponseInterface::getCSP()(および Response::getCSP())、ResponseInterface::getReasonPhrase()ResponseInterface::getCookieStore() メソッドを追加しました。

  • データベース: 欠けていた CodeIgniter\Database\ResultInterface::getNumRows() メソッドを追加しました。

  • こちらも参照してください バリデーションの変更.

メソッドシグネチャの変更

バリデーションの変更

ValidationInterface

ValidationInterfaceValidation クラスの不一致を解消するために、ValidationInterface が変更されました。

  • ValidationInterface::run() に3番目のパラメータ $dbGroup が追加されました。

  • 以下のメソッドがインターフェースに追加されました。

    • ValidationInterface::setRule()

    • ValidationInterface::getRules()

    • ValidationInterface::getRuleGroup()

    • ValidationInterface::setRuleGroup()

    • ValidationInterface::loadRuleGroup()

    • ValidationInterface::hasError()

    • ValidationInterface::listErrors()

    • ValidationInterface::showError()

Validation

Validation::loadRuleGroup() の戻り値が、$group が空の場合、null から [] に変更されました。

データベース

  • CodeIgniter\Database\BasePreparedQuery::close()CodeIgniter\Database\PreparedQueryInterface の戻り値の型が、(以前は型なしでしたが)bool に変更されました。

  • CodeIgniter\Database\Database::loadForge() の戻り値の型が Forge に変更されました。

  • CodeIgniter\Database\Database::loadUtils() の戻り値の型が BaseUtils に変更されました。

  • Table::dropForeignKey() のパラメータ名 $column$foreignName に変更されました。

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

  • BaseBuilder::insertBatch()BaseBuilder::updateBatch()$set パラメータは、現在、1行のデータのオブジェクトを受け入れます。

  • BaseBuilder::_updateBatch()
    • 2番目のパラメータ $values$keys に変更されました。

    • 3番目のパラメータ $index$values に変更されました。パラメータの型も array に変更されました。

データベースForge

  • Forge::dropKey() のメソッドシグネチャが変更されました。オプションのパラメータ $prefixKeyName が追加されました。

  • Forge::addKey() のメソッドシグネチャが変更されました。オプションのパラメータ $keyName が追加されました。

  • Forge::addPrimaryKey() のメソッドシグネチャが変更されました。オプションのパラメータ $keyName が追加されました。

  • Forge::addUniqueKey() のメソッドシグネチャが変更されました。オプションのパラメータ $keyName が追加されました。

  • 以下のメソッドに、追加の $asQuery パラメータがあります。 true に設定すると、メソッドはスタンドアロンのSQLクエリを返します。

    • CodeIgniter\Database\Forge::_processPrimaryKeys()

  • 上記の $asQuery パラメータの追加に加えて、以下のメソッドも配列を返すようになりました。

    • CodeIgniter\Database\Forge::_processIndexes()

    • CodeIgniter\Database\Forge::_processForeignKeys()

その他

  • API: API\ResponseTrait::failServerError() の戻り値の型が ResponseInterface に変更されました。

  • 以下のメソッドは、Response の代わりに ResponseInterface をパラメータとして受け入れるように変更されました。

    • Debug\Exceptions::__construct()

    • Services::exceptions()

  • リクエスト: IncomingRequest::getJsonVar()$index パラメータは、現在、arraystring、または null 値を受け入れます。

機能強化

コマンド

  • CodeIgniter\CodeIgniter クラスからのSparkコマンドのコールハンドラが抽出されました。これにより、コンソール呼び出しのコストが削減されます。

  • ルートのフィルタをチェックするための spark filter:check コマンドを追加しました。詳細はコントローラフィルタを参照してください。

  • 新しいCellファイルとそのビューを作成するspark make:cellコマンドを追加しました。コマンドによるCellの生成で詳細を確認してください。

  • これでspark routesコマンドはルート名を表示します。URIルーティングを参照してください。

  • これでspark routesコマンドは、出力をハンドラーでソートできます。ハンドラーによるソートを参照してください。

  • sparkコマンドのヘルプ情報は、--helpオプションを使用してアクセスできるようになりました (例: php spark serve --help)

  • promptByKey()とは異なり、入力に複数の値をサポートするために、CLI::promptByMultipleKeys()メソッドを追加しました。promptByMultipleKeys()で詳細を確認してください。

  • HTTP/3は、有効なプロトコルと見なされるようになりました。

テスト

  • STDOUTおよびSTDERRストリームからのデータのキャプチャ処理を容易にするために、StreamFilterTraitを追加しました。CLI出力のテストを参照してください。

  • CITestStreamFilterフィルタクラスは、ストリームにフィルタを追加するためのメソッドを実装するようになりました。CLI出力のテストを参照してください。

  • php://stdinへのデータの設定を容易にするために、PhpStreamWrapperを追加しました。CLI入力のテストを参照してください。

  • 呼び出し可能関数のパフォーマンスを測定するためのTimer::record()メソッドを追加しました。また、共通関数timer()を拡張して、オプションで呼び出し可能関数を許可しました。

  • ログメッセージが逐語的にチェックされるかどうかを設定するブール型の第3パラメーター$useExactComparisonTestLogger::didLog()に追加されました。これはデフォルトでtrueです。

  • CIUnitTestCase::assertLogContains()メソッドを追加しました。これは、メッセージ全体ではなく、一部に基づいてログメッセージを比較します。

データベース

クエリビルダー

  • QueryBuilderにupsert()upsertBatch()メソッドを追加しました。データのUpsertを参照してください。

  • QueryBuilderにdeleteBatch()メソッドを追加しました。一括削除を参照してください。

  • クエリに条件付きで句を追加するためのwhen()whenNot()メソッドを追加しました。詳細はBaseBuilder::when()を参照してください。

  • Builder::updateBatch()のSQL構造を改善しました。詳細は一括更新を参照してください。

  • BaseBuilder::setQueryAsData()を追加しました。これにより、クエリからinsertBatch()updateBatch()upsertBatch()deleteBatch()を実行できます。insertBatchを参照してください。

Forge

  • 既存のテーブルにインデックスを作成できるようにForge::processIndexes()を追加しました。詳細はテーブルへのキーの追加を参照してください。

  • インデックス名を手動で設定する機能を追加しました。これらのメソッドには、Forge::addKey()Forge::addPrimaryKey()Forge::addUniqueKey()が含まれます。

  • Forge::dropPrimaryKey()メソッドを追加し、テーブルの主キーを削除できるようにしました。主キーの削除を参照してください。

  • Forge::dropKey()を修正し、一意のインデックスを削除できるようにしました。これにはDROP CONSTRAINT SQLコマンドが必要でした。

  • CodeIgniter\Database\Forge::addForeignKey()に、外部キー名を手動で設定するための名前パラメーターが含まれるようになりました。SQLite3ではサポートされていません。

  • SQLSRVは、Forge::dropColumn()を使用する場合、DEFAULT制約を自動的に削除するようになりました。

その他

  • SQLite3には、テーブルがロックされている場合のタイムアウトを設定するための新しいConfig項目busyTimeoutが追加されました。

  • BaseConnection::escape()は、RawSqlデータ型を除外するようになりました。これにより、SQL文字列をデータに渡すことができます。

  • BaseConnection::getForeignKeyData()によって返されるデータを改善しました。すべてのDBMSが同じ構造を返すようになりました。

  • SQLiteのBaseConnection::getIndexData()は、AUTOINCREMENT列に対してPRIMARYという名前の擬似インデックスを返すことができるようになり、返される各インデックスデータにはtypeプロパティがあります。

  • BasePreparedQuery::close()は、すべてのDBMSでプリペアドステートメントを解放するようになりました。以前は、Postgre、SQLSRV、OCI8では解放されていませんでした。close()を参照してください。

  • トランザクション中に例外をスローするためのBaseConnection::transException()を追加しました。例外のスローを参照してください。

モデル

  • BaseModel::insertBatch()メソッドとBaseModel::updateBatch()メソッドに、beforeイベントとafterイベントを追加しました。クエリビルダーの使用を参照してください。

  • 空のデータ挿入を行うためのModel::allowEmptyInserts()メソッドを追加しました。CodeIgniterのモデルの使用を参照してください。

  • Entityに新しいプロパティキャストクラスIntBoolCastを追加しました。

ライブラリ

  • **Publisher:** Publisherでファイルを修正するためのreplace()addLineAfter()addLineBefore()メソッドを追加しました。詳細はPublisherを参照してください。

  • **Encryption:** これで、EncryptionはCI3のEncryptionで暗号化されたデータを復号化できます。CI3との互換性を維持するための設定を参照してください。

  • **CURLRequest:** CURLRequestにHTTP2のバージョンのオプションを追加しました。

ヘルパーと関数

  • これで、**app/Config/Autoload.php**でヘルパーを自動ロードできます。

  • 検証エラーを表示するための新しいFormヘルパー関数validation_errors()validation_list_errors()validation_show_error()を追加しました。

  • 最後のパラメーターとしてロケール値を渡すと、route_to()にロケールを設定できます。

  • request()関数とresponse()関数を追加しました。

  • camelCaseをsnake_caseに変換するdecamelize()関数を追加しました。

  • Windowsプラットフォームを検出するためのis_windows()グローバル関数を追加しました。

HTML5互換性

<input>のようなvoid HTML要素の作成は、**app/Config/DocTypes.php**で$html5プロパティを設定することで、右山括弧(>)の前にスラッシュ文字(/)を除外するかどうかを設定できます。trueに設定すると、/のないHTML5互換タグ(例:<br>)が出力されます。

影響を受ける項目は以下のとおりです。

  • Typographyクラス: brタグの作成

  • ビューパーサー: nl2brフィルタ

  • ハニーポット: inputタグ

  • Formヘルパー

  • HTMLヘルパー

  • 共通関数

エラー処理

  • 例外をスローする代わりに、非推奨警告をログに記録できるようになりました。詳細は非推奨警告のログ記録を参照してください。

  • 非推奨のログ記録はデフォルトで有効になっています。

  • 非推奨警告の一時的な有効化を行うには、環境変数CODEIGNITER_SCREAM_DEPRECATIONSに真値を設定します。

  • Config\Logger::$thresholdは、デフォルトで環境依存になりました。本番環境ではデフォルトの閾値は4のままですが、他の環境では9に変更されました。

複数ドメインサポート

  • Config\App::$allowedHostnamesが追加され、baseURLのホスト名以外のホスト名を設定できるようになりました。

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

その他

  • ルーティング: $routes->useSupportedLocalesOnly(true)が追加されました。これにより、URLのロケールがConfig\App::$supportedLocalesでサポートされていない場合、ルーターは404 Not Foundを返します。ローカリゼーションを参照してください。

  • ルーティング: ビューを直接返す新しい$routes->view()メソッドが追加されました。ビュールートを参照してください。

  • ビュー: ビューセルは第一級市民となり、app/Cellsディレクトリに配置できるようになりました。ビューセルを参照してください。

  • ビュー: ビューセルにより多くの構造と柔軟性を与えるControlled Cellsが追加されました。詳細はビューセルを参照してください。

  • バリデーション: クロージャバリデーションルールが追加されました。詳細はクロージャルールの使用を参照してください。

  • 設定: Composerパッケージを手動で自動検出するように指定できるようになりました。コードモジュールを参照してください。

  • 設定: セッション設定を処理するConfig\Sessionクラスが追加されました。

  • デバッグ: Kintが5.0.2にアップデートされました。

  • リクエスト: 生データストリームから指定された変数を返す新しい$request->getRawInputVar()メソッドが追加されました。生データの取得を参照してください。

  • リクエスト: リクエストの種類を問い合わせる新しい$request->is()メソッドが追加されました。リクエストの種類の判定を参照してください。

メッセージの変更

  • 英語の文字列をより一貫性のあるものに変更しました。

  • CLI.generator.className.cellCLI.generator.viewName.cellが追加されました。

  • en/Errors.phpファイルが追加されました。

変更点

  • 設定
    • Configクラス内のすべての原子型プロパティに型が付けられました。

    • デフォルト値の変更についてはアップグレードを参照してください。

  • Sparkコマンドの処理を変更しました。
    • CodeIgniter\CodeIgniterはSparkコマンドを処理しなくなりました。

    • CodeIgniter::isSparked()メソッドが削除されました。

    • Sparkコマンドの処理の変更に伴い、CodeIgniter\CLI\CommandRunnerクラスが削除されました。

    • システムルート設定ファイルsystem/Config/Routes.phpが削除されました。

    • ルート設定ファイルapp/Config/Routes.phpが変更されました。システムルート設定ファイルのインクルードを削除しました。

非推奨化

  • RouteCollection::localizeRoute()は非推奨になりました。

  • RouteCollection::fillRouteParams()は非推奨になりました。RouteCollection::buildReverseRoute()を使用してください。

  • BaseBuilder::setUpdateBatch()BaseBuilder::setInsertBatch()は非推奨になりました。BaseBuilder::setData()を使用してください。

  • 公開プロパティResponse::$CSPは非推奨になりました。保護されたプロパティになります。Response::getCSP()を使用してください。

  • CodeIgniter::$pathCodeIgniter::setPath()は非推奨になりました。もはや使用されていません。

  • 公開プロパティIncomingRequest::$uriは非推奨になりました。保護されたプロパティになります。IncomingRequest::getUri()を使用してください。

  • 公開プロパティIncomingRequest::$configは非推奨になりました。保護されたプロパティになります。

  • メソッドCLI::isWindows()は非推奨になりました。is_windows()を使用してください。

  • Config\Appのセッションプロパティは、新しいセッション設定クラスConfig\Sessionに置き換えられました。

修正されたバグ

  • すべてのタイプのPrepared Queriesが、書き込みタイプのクエリに対してbool値ではなくResultオブジェクトを返すバグを修正しました。

  • IncomingRequest::getVar()またはIncomingRequest::getJsonVar()メソッドを使用したJSONリクエストでの変数フィルタリングのバグを修正しました。

  • IncomingRequest::getVar()またはIncomingRequest::getJsonVar()メソッドで指定されたインデックスを使用する場合、変数の型が変更される可能性があるバグを修正しました。

  • CSPが有効になっている場合にHoneypotフィールドが表示されるバグを修正しました。HoneypotとCSPも参照してください。

修正されたバグの完全なリストについては、リポジトリのCHANGELOG.mdを参照してください。