バージョン 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 でも、デフォルトでは例外はスローされません。DBDebug
とCI_DEBUG
の変更環境に関係なく動作を統一するために、
Config\Database::$default['DBDebug']
とConfig\Database::$tests['DBDebug']
はデフォルトでtrue
に変更されました。これらの設定により、データベースエラーが発生すると常に例外がスローされます。以前は、**本番環境でのみ**false
でした。現在、
BaseBuilder
でスローされるDatabaseException
は、$DBDebug
が true の場合にスローされます。以前は、CI_DEBUG
が true の場合にスローされていました。BaseConnection::$DBDebug
のデフォルト値はtrue
に変更されました。これらの変更により、
DBDebug
は **エラー発生時に例外をスローするかどうかを意味するようになりました**。デバッグとは無関係ですが、名前は変更されていません。DBDebug
がtrue
の状態でトランザクションを実行する場合、クエリエラーが発生しても、デフォルトでは例外はスローされません。以前は、クエリエラーが発生すると、すべてのクエリがロールバックされ、例外がスローされていたため、エラーの管理 または トランザクションの手動実行 は機能しませんでした。現在、
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
クラスを追加しました。現在、
RequestInterface
はOutgoingRequestInterface
を拡張しています。現在、
CURLRequest
はOutgoingRequest
を拡張しています。現在、
Request
はOutgoingRequest
を拡張しています。
その他
HTTP:
MessageInterface
に欠けていたgetProtocolVersion()
、getBody()
、hasHeader()
、getHeaderLine()
メソッドを追加しました。HTTP: 現在、
ResponseInterface
はMessageInterface
を拡張しています。HTTP: 欠けていた
ResponseInterface::getCSP()
(およびResponse::getCSP()
)、ResponseInterface::getReasonPhrase()
、ResponseInterface::getCookieStore()
メソッドを追加しました。データベース: 欠けていた
CodeIgniter\Database\ResultInterface::getNumRows()
メソッドを追加しました。こちらも参照してください バリデーションの変更.
メソッドシグネチャの変更
バリデーションの変更
ValidationInterface
ValidationInterface
と Validation
クラスの不一致を解消するために、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
パラメータは、現在、array
、string
、または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パラメーター
$useExactComparison
がTestLogger::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.cell
とCLI.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::$path
とCodeIgniter::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を参照してください。