バージョン 4.4.0

リリース日:2023年8月25日

CodeIgniter4の4.4.0リリース

ハイライト

  • デバッグツールバーに新しい「ホットリロード」機能が追加されました (貢献者 lonnieezell)。テスト を参照してください。

破壊的変更

動作変更

URI::setSegment() と存在しないセグメント

最後の +2 セグメントを設定すると、例外がスローされるようになりました。以前のバージョンでは、最後のセグメント +3 以上を指定した場合のみ例外がスローされていました。URI::setSegment() の変更 を参照してください。

現在の最後のセグメントの次のセグメント (+1) は、以前と同様に設定できます。

ファクトリー

名前空間付きのクラス名を渡す

現在、preferApp は、名前空間なしでクラス名をリクエストする場合にのみ機能します。

たとえば、model(\Myth\Auth\Models\UserModel::class) または model('Myth\Auth\Models\UserModel') を呼び出す場合

  • 以前

    • 存在する場合、preferApp が true (デフォルト) の場合、App\Models\UserModel を返します。

    • 存在する場合、preferApp が false の場合、Myth\Auth\Models\UserModel を返します。

  • その後

    • preferApp が true (デフォルト) の場合でも、Myth\Auth\Models\UserModel を返します。

    • model() を呼び出す前に Factories::define('models', 'Myth\Auth\Models\UserModel', 'App\Models\UserModel') を定義した場合、App\Models\UserModel を返します。

誤って存在しないクラス名を渡した場合、以前のバージョンでは、preferApp 機能により、App または Config 名前空間のクラスインスタンスが返されていました。

たとえば、コントローラー (namespace App\Controllers) で、誤って config(Config\App::class) を呼び出した場合 (クラスに先頭の \ がないことに注意してください)、つまり実際には App\Controllers\Config\App を渡したことになります。しかし、そのクラスは存在しないため、現在、ファクトリーは null を返します。

プロパティ名

プロパティ Factories::$basenames の名前が $aliases に変更されました。

オートローダー

以前、CodeIgniterのオートローダーでは、.php拡張子で終わるクラス名をロードすることができました。つまり、new Foo.php() のようなオブジェクトをインスタンス化することができ、new Foo() としてインスタンス化されました。Foo.php は無効なクラス名であるため、オートローダーのこの動作は変更されました。現在、このようなクラスをインスタンス化しようとすると失敗します。

CodeIgniter と exit()

CodeIgniter::run() メソッドは、exit(EXIT_SUCCESS) を呼び出さなくなりました。exit 呼び出しは public/index.php に移動しました。

サイトURIの変更

URI クラスを拡張し、サイトURIを表す新しい SiteURI クラスが追加され、現在のURIが必要な多くの場所で使用されるようになりました。

コントローラー内の $this->request->getUri() は、SiteURI インスタンスを返します。また、site_url()base_url()、および current_url() は、内部的に SiteURI を使用します。

getPath()

getPath() メソッドは、先頭に / を付けたフルURIパスを常に返すようになりました。したがって、baseURLにサブディレクトリがあり、baseURLへの相対パスを取得する場合は、代わりに新しい getRoutePath() メソッドを使用する必要があります。

        baseURL: http://localhost:8888/CodeIgniter4/
The current URI: http://localhost:8888/CodeIgniter4/foo/bar
      getPath(): /CodeIgniter4/foo/bar
 getRoutePath(): foo/bar
サイトURIの値

SiteURIクラスは、以前よりも厳密にサイトURIを正規化するようになり、いくつかのバグが修正されました。

その結果、フレームワークは以前のバージョンとは若干異なるサイト URI または URI パスを返す場合があります。例えば、index.php の後に / が追加されます。

http://example.com/test/index.php?page=1

http://example.com/test/index.php/?page=1

インターフェースの変更

注意

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

  • バリデーション: ValidationInterfacegetValidated() メソッドが追加されました。

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

パラメータの型変更

  • サービス
    • Services::security() の最初のパラメータが Config\App から Config\Security に変更されました。

    • Services::session() の最初のパラメータが Config\App から Config\Session に変更されました。

  • セッション
    • Session::__construct() の2番目のパラメータが Config\App から Config\Session に変更されました。

    • データベースの BaseHandlerDatabaseHandlerFileHandlerMemcachedHandler、および RedisHandler__construct() の最初のパラメータが Config\App から Config\Session に変更されました。

  • セキュリティ: Security::__construct() の最初のパラメータが Config\App から Config\Security に変更されました。

  • バリデーション: Validation::check() のメソッドシグネチャが変更されました。$rule パラメータの string 型ヒントが削除されました。

  • CodeIgniter: CodeIgniter::setRequest() のメソッドシグネチャが変更されました。$request パラメータの Request 型ヒントが削除されました。

  • FeatureTestCase
    • FeatureTestCase::populateGlobals() のメソッドシグネチャが変更されました。$request パラメータの Request 型ヒントが削除されました。

    • FeatureTestCase::setRequestBody() のメソッドシグネチャが変更されました。$request パラメータの Request 型ヒントと戻り値の型 Request が削除されました。

パラメータの追加

  • ルーティング: RouteCollection::__construct() に3番目のパラメータ Routing $routing が追加されました。

パラメータの削除

  • サービス: Services::exceptions() の2番目のパラメータ $request と3番目のパラメータ $response が削除されました。

  • エラー処理: CodeIgniter\Debug\Exceptions::__construct() の2番目のパラメータ $request と3番目のパラメータ $response が削除されました。

戻り値の型の変更

  • オートローダー: loadClass および loadClassmap メソッドの戻り値の型が void になり、spl_autoload_register および spl_autoload_unregister 関数のコールバックとして互換性を持つようになりました。

機能強化

コマンド

  • spark routes
    • リクエスト URL でホストを指定できるようになりました。「ホストの指定」を参照してください。

    • 次のように、ハンドラーView ルートのビューファイルが表示されます。

      メソッド

      ルート

      名前

      ハンドラー

      事前フィルター

      事後フィルター

      GET

      about

      »

      (View) pages/about

      ツールバー

テスト

  • デバッグバー
    • デバッグツールバーに、ファイルが変更されたときにページを自動的にリロードできる新しい「ホットリロード」機能が追加されました。「ホットリロード」を参照してください。

    • Routes タブの 定義済みルートView ルートが表示されるようになりました。

データベース

  • MySQLi: SQL クエリ後に取得される変数の型をデータベースで設定された型と一致させるために、データベース構成に numberNative 属性が追加されました。「データベース設定」を参照してください。

  • SQLSRV: フィールドメタデータに nullable が含まれるようになりました。「$db->getFieldData()」を参照してください。

モデル

  • メソッド名の衝突を避けるために、エンティティに特別なゲッター/セッターが追加されました。「特別なゲッター/セッター」を参照してください。

ライブラリ

  • バリデーション: 実際に検証されたデータを取得する Validation::getValidated() メソッドが追加されました。詳細は「検証済みデータの取得」を参照してください。

  • 画像: オプション $quality を使用して WebP 画像を圧縮できるようになりました。

  • アップロードされたファイル: ディレクトリアップロードによってファイルがアップロードされた場合、ファイルの full_path インデックスの値を返す UploadedFiles::getClientPath() メソッドが追加されました。

  • CURLRequest: リクエストオプション proxy が追加されました。「CURLRequest クラス」を参照してください。

  • URI: URI を拡張し、サイト URI を表す新しい SiteURI クラスが追加されました。

ヘルパーと関数

  • 配列: データの値をグループ化する array_group_by() ヘルパー関数が追加されました。ドット表記構文をサポートします。

  • 共通: force_https() はアプリケーションを終了させなくなりましたが、RedirectException をスローします。

その他

  • DownloadResponse: ブラウザでファイルを表示するための Content-Disposition: inline ヘッダーを設定する DownloadResponse::inline() メソッドが追加されました。詳細は「ブラウザでファイルを開く」を参照してください。

  • ビュー: 表示後のデータ自動クリーンを防ぐために、renderSection() にオプションの 2 番目のパラメータ $saveData が追加されました。詳細は「ビューレイアウト」を参照してください。

  • 自動ルーティング (改善):
    • モジュールへのルーティングが可能になりました。詳細は「モジュールルーティング」を参照してください。

    • URIセグメントに対応するコントローラーが見つかり、そのコントローラーがそのURIセグメントに対して定義されたメソッドを持たない場合、デフォルトメソッドが実行されるようになりました。この追加により、自動ルーティングにおけるURIの処理がより柔軟になります。詳細はデフォルトメソッドフォールバックを参照してください。

  • フィルター: $filtersプロパティでフィルター引数を使用できるようになりました。

  • リクエスト: 有効なロケールを設定するためのIncomingRequest::setValidLocales()メソッドが追加されました。

  • テーブル: 行の列をヘッダーと同期するためのTable::setSyncRowsWithHeading()メソッドが追加されました。詳細は行とヘッダーの同期を参照してください。

  • エラー処理: カスタム例外ハンドラーを使用できるようになりました。

  • RedirectException
    • 最初の引数として、ResponseInterfaceを実装するオブジェクトを受け取ることもできます。

    • ResponsableInterfaceを実装しています。

  • ファクトリー

メッセージの変更

  • Core.invalidDirectoryエラーメッセージが追加されました。

  • HTTP.invalidHTTPProtocolエラーメッセージが改善されました。

変更点

  • 画像: GDHandlerにおけるWebPのデフォルトの品質が80から90に変更されました。

  • 設定
    • app/Config/App.phpの非推奨のCookie項目が削除されました。

    • app/Config/App.phpの非推奨のSession項目が削除されました。

    • app/Config/App.phpの非推奨のCSRF項目が削除されました。

    • ルーティング設定がapp/Config/Routing.php設定ファイルに移動されました。詳細はアップグレードガイドを参照してください。

  • DownloadResponse: レスポンスヘッダーを生成する際、Content-Dispositionヘッダーが以前に指定されていた場合は、それを置き換えなくなりました。

  • オートローダー
    • v4.4.0より前では、CodeIgniterオートローダーは、特定のオペレーティングシステムでファイル名に使用できない特殊文字を許可していませんでした。使用できる記号は、/_.:\、およびスペースです。そのため、()などの特殊文字を含むフォルダーにCodeIgniterをインストールした場合、CodeIgniterは動作しませんでした。v4.4.0以降、この制限は削除されました。

    • Autoloader::loadClass()およびAutoloader::loadClassmap()メソッドは、どちらも@internalとしてマークされるようになりました。

  • RouteCollection: 保護されたプロパティ$routesの配列構造がパフォーマンスのために変更されました。

  • HSTS: force_https()またはConfig\App::$forceGlobalSecureRequests = trueを設定すると、HTTPリクエストメソッドがリダイレクト後に保持されるHTTPステータスコード307が設定されるようになりました。以前のバージョンでは、302でした。

非推奨

  • エンティティ: Entity::setAttributes()は非推奨になりました。代わりにEntity::injectRawData()を使用してください。

  • エラー処理: CodeIgniter\Debug\Exceptionsの多くのメソッドとプロパティが非推奨になりました。これらのメソッドはBaseExceptionHandlerまたはExceptionHandlerに移動したためです。

  • オートローダー: Autoloader::sanitizeFilename()は非推奨になりました。

  • CodeIgniter
    • CodeIgniter::$returnResponseプロパティは非推奨になりました。もう使用されていません。

    • CodeIgniter::$cacheTTLプロパティは非推奨になりました。もう使用されていません。代わりにResponseCacheを使用してください。

    • CodeIgniter::cache()メソッドは非推奨になりました。もう使用されていません。代わりにResponseCacheを使用してください。

    • CodeIgniter::cachePage()メソッドは非推奨になりました。もう使用されていません。代わりにResponseCacheを使用してください。

    • CodeIgniter::generateCacheName()メソッドは非推奨になりました。もう使用されていません。代わりにResponseCacheを使用してください。

    • CodeIgniter::callExit()メソッドは非推奨になりました。もう使用されていません。

  • RedirectException: \CodeIgniter\Router\Exceptions\RedirectExceptionは非推奨になりました。代わりに\CodeIgniter\HTTP\Exceptions\RedirectExceptionを使用してください。

  • セッション: Sessionのプロパティ$sessionDriverName$sessionCookieName$sessionExpiration$sessionSavePath$sessionMatchIP$sessionTimeToUpdate、および$sessionRegenerateDestroyは非推奨となり、もう使用されていません。代わりに$configを使用してください。

  • セキュリティ: Securityのプロパティ$csrfProtection$tokenRandomize$tokenName$headerName$expires$regenerate、および$redirectは非推奨となり、もう使用されていません。代わりに$configを使用してください。

  • URI
    • URI::$uriStringは非推奨になりました。

    • URI::$baseURLは非推奨になりました。代わりにSiteURIを使用してください。

    • URI::setSilent()は非推奨になりました。

    • URI::setScheme()は非推奨になりました。代わりにwithScheme()を使用してください。

    • URI::setURI()は非推奨になりました。

  • IncomingRequest
    • IncomingRequest::detectURI()は非推奨となり、もう使用されていません。

    • IncomingRequest::detectPath()は非推奨となり、もう使用されていません。SiteURIFactoryに移動しました。

    • IncomingRequest::parseRequestURI()は非推奨となり、もう使用されていません。SiteURIFactoryに移動しました。

    • IncomingRequest::parseQueryString()は非推奨となり、もう使用されていません。SiteURIFactoryに移動しました。

    • IncomingRequest::setPath()は非推奨になりました。

バグ修正

  • 自動ルーティング (改善): 以前のバージョンでは、$translateURIDashesがtrueの場合、2つのURIが1つのコントローラーメソッドに対応し、1つのURIがダッシュ付き (例: foo-bar)、もう1つのURIがアンダースコア付き (例: foo_bar) でした。このバグは修正されました。アンダースコア付きのURI (foo_bar) にはアクセスできなくなりました。

  • 出力バッファリング: 出力バッファリングに関するバグ修正。

  • ControllerTestTrait: ControllerTestTrait::withUri()は、URIを持つ新しいRequestインスタンスを作成します。RequestインスタンスはURIインスタンスを持つ必要があるためです。また、URI文字列のホスト名がConfig\Appで無効な場合、有効なホスト名が設定されます。

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