CodeIgniter 4.3 の変更点

CodeIgniter 4.3 は 2023-01-10 にリリースされたCodeIgniter4の最新バージョンです。

多くの機能追加と 破壊的な変更 が含まれています。アップグレードする前に以下を必ず確認してください。

ハイライト

  • Query Builderに upsert() および upsertBatch()deleteBatch() メソッドが追加され、また、*Batch() メソッドはクエリからデータをセットできるようになりました。
  • デフォルトのバリデーションルールがStrictルールに変更されました。
  • データベースエラーが発生した場合の例外処理が変更されました。

主な破壊的変更

データベースエラーが発生した場合の例外処理

データベースエラーが発生した場合に例外を投げるかどうかが変更されました。

以前のバージョンでは、開発・テスト環境では、データベースエラーが発生した場合に例外が投げられました。しかし、本番環境では例外は投げられず false が返りました。

このように本番環境と開発・テスト環境で振る舞いが変わると、テストが書きづらいです。また、開発環境での動作しか知らない場合は、返り値をチェックするコードを書き忘れ、本番環境でのみエラーが発生しても処理が続いてしまう可能性がありました。

そのため、以下のように変更されました。

  • データベースエラーが発生したときに投げられる例外クラスが、データベースドライバにより異なっていたものが、DatabaseException に統一されました。
  • DBDebugCI_DEBUG の変更
    • データベース設定ファイルでのデフォルトの DBDebug の値が true に変更されました。
    • 以前のバージョンでは、本番環境にみ false に設定されていました。
    • Query Builderは DBDebugtrue の場合に例外を投げるようになりました。
    • 以前のバージョンでは、CI_DEBUGtrue の場合に例外を投げていました。
    • 上記に変更により、DBDebug はエラー時に例外を投げるかどうかのフラグに意味が変わりました。
    • ただし、トランザクション中は、DBDebugtrue でも例外が発生しないように変更されました。
    • もし、トランザクション中でも例外が発生して欲しい場合は、$db->transException(true) をトランザクション開始前に実行してください。

これで、開発時でも本番環境でも、エラーが発生した場合は例外が発生するようになりました(トランザクション中は除く)。

ただし、データベース設定ファイルは composer update では更新されませんので、既存のプロジェクトはほぼ今まで通り、本番では例外が発生しないままになります。

主な機能追加

Formヘルパー

バリデーションのエラーを表示するための validation_errors()validation_list_errors()validation_show_error() 関数が追加されました。

Query Builder

upsert()upsertBatch()deleteBatch() メソッドが追加されました。

また、クエリーの結果をデータとして使う setQueryAsData() メソッドが追加され、insertBatch()updateBatch()upsertBatch()deleteBatch() メソッドで使えます。例えば、SELECTした結果をINSERTすることができます。

$subQuery = $this->db->table('user2')
            ->select('user2.name, user2.email, user2.country')
            ->join('user', 'user.email = user2.email', 'left')
            ->where('user.email IS NULL');
$this->db->table('user')->setQueryAsData($subQuery)->insertBatch();

Database Forge

既存のテーブルにインデックスを追加する Forge::processIndexes() メソッドが追加されました。

$this->forge->addKey(['category', 'name'], false, false, 'category_name');
$this->forge->addPrimaryKey('id', 'pk_actions');
$this->forge->addForeignKey('userid', 'user', 'id', '', '', 'userid_fk');
$this->forge->processIndexes('actions');

複数ドメインのサポート

設定ファイル app/Config/App.php$allowedHostnames が追加され、$baseURL で設定されているホスト名以外の別のホスト名を設定することができるようになりました。

この設定により、 base_url()current_url()site_url() などの返す値のホスト名部分が、リクエストに応じて変わります。

spark routes コマンド

spark routes コマンドが、ルート名を表示するようになりました。

$ php spark routes

CodeIgniter v4.3.0 Command Line Tool - Server Time: 2023-01-13 08:42:59 UTC+00:00

+-----------+-----------------+------+-----------------------------------+----------------+---------------+
| Method    | Route           | Name | Handler                           | Before Filters | After Filters |
+-----------+-----------------+------+-----------------------------------+----------------+---------------+
| GET       | /               | »    | \App\Controllers\Home::index      |                | toolbar       |
| GET       | feed            | »    | (Closure)                         |                | toolbar       |
| GET(auto) | product/list/.. |      | \App\Controllers\Product::getList |                | toolbar       |
+-----------+-----------------+------+-----------------------------------+----------------+---------------+

»Route と同じことを意味します。ルート feed のルート名は feed ということです。 なお、自動ルートにはルート名はありません。

HTML5互換性の向上

設定ファイル app/Config/DocTypes.php$html5 が追加され、true にセットされた場合は、ヘルパーなどが出力するHTMLの空の要素(brなど)が <br /> ではなく、HTML5互換の <br> になります。

他にも機能追加は多数あります。全てのリストは、 ChageLog を参照してください。

関連

参考

Date: 2023/01/13

Tags: codeigniter, codeigniter4, release