CodeIgniter 4.2 の変更点

この記事は CodeIgniter Advent Calendar 2022 - Qiita の4日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

(2023-01-13 追記) CodeIgniter 4.3 がリリースされています。 「CodeIgniter 4.3 の変更点」 を参照してください。

CodeIgniter 4.2 は 2022-06-03 にリリースされたCodeIgniter4の現行バージョンです。 最新バージョンは執筆時点では 4.2.10 です。

なお、4.2.6 以前にはセキュリティ勧告が出ていますので、必ずアップデートしてください。

ハイライト

  • 動作には PHP 7.4 以降が必要になりました。
  • 自動ルーティングがデフォルトでオフに変更されました。
  • 新しい改善された自動ルーティングが追加されました(オプトイン)。
  • Oracle Databaseがサポートされました。
  • Query BuilderでサブクエリとUNIONがサポートされました。

破壊的な改善

マイナーバージョンアップですが、破壊的な変更があります。

特に、index.phpspark が変更されたため、それらを更新しないと、全く動作しなくなりますので、注意してください。

アップグレード手順の例:

$ composer update
$ cp vendor/codeigniter4/framework/public/index.php public/index.php
$ cp vendor/codeigniter4/framework/spark .

詳細は、Upgrading from 4.1.9 to 4.2.0 および Change Log 4.2.0 を参照してください。

主な機能追加

新しい改善された自動ルーティング

従来の自動ルーティングはあまりにも簡単に脆弱性を作り込んでしまうため、 より安全な改善された自動ルーティングが追加されました。

従来の自動ルーティングとの違いは以下の通りです。

  • コントローラのメソッド名に getIndex()postCreate() のようにHTTP動詞のプリフィックスが必須
  • デフォルトコントローラ(デフォルトでは Home)とデフォルトメソッド(デフォルトではindex)はURLの中で必ず省略される
  • メソッドのパラメータ数がチェックされる
  • _remap() メソッドはサポートされない
  • 定義されたルートで使われているコントローラには自動ルーティングではアクセスできない

URLとコントローラメソッドが必ず一対一で対応するようになっています。

以下の記事も参照してください。

Query Builder の機能追加

サブクエリ

FROM句(fromSubquery())とSELECT句(selectSubquery())でサブクエリが使えるようになりました。

$subquery = $db->table('users')->select('id, name');
$builder  = $db->newQuery()->fromSubquery($subquery, 't');
$query    = $builder->get();
// 生成されるSQL: SELECT * FROM (SELECT `id`, `name` FROM users) `t`
$subquery = $db->table('countries')->select('name')->where('id', 1);
$builder  = $db->table('users')->select('name')->selectSubquery($subquery, 'country');
$query    = $builder->get();
// 生成されるSQL: SELECT `name`, (SELECT `name` FROM `countries` WHERE `id` = 1) `country` FROM `users`
UNION

UNION(union())とUNION ALL(unionAll())が使えるようになりました。

$builder = $db->table('users')->select('id, name')->limit(10);
$union   = $db->table('groups')->select('id, name');
$builder->union($union)->get();
/*
 * 生成されるSQL:
 * SELECT * FROM (SELECT `id`, `name` FROM `users` LIMIT 10) uwrp0
 * UNION SELECT * FROM (SELECT `id`, `name` FROM `groups`) uwrp1
 */
RawSql

生のSQL文字列を表す CodeIgniter\Database\RawSql クラスが追加され、 select(), where(), like(), join() (および DBForge::addField() のデフォルト値)で使えるようになりました。

use CodeIgniter\Database\RawSql;

$sql = 'REGEXP_SUBSTR(ral_anno,"[0-9]{1,2}([,.][0-9]{1,3})([,.][0-9]{1,3})") AS ral';
$builder->select(new RawSql($sql));
$query = $builder->get();

なお、RawSql は与えられた文字列をそのままデータベースに渡すことになりますので、 値のエスケープなどはユーザーがきちんとする必要があります。エスケープなどに漏れがあれば、SQLインジェクションが可能になります。

spark routes コマンド

spark routes コマンドが、クロージャルート、自動ルート、そしてコントローラフィルタを表示するようになりました。

$ php spark routes

CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-04 02:39:23 UTC+00:00

+-----------+-----------------+------------------------------------------+----------------+---------------+
| Method    | Route           | Handler                                  | Before Filters | After Filters |
+-----------+-----------------+------------------------------------------+----------------+---------------+
| GET       | /               | \App\Controllers\Home::index             |                | toolbar       |
| GET       | feed            | (Closure)                                |                | toolbar       |
| CLI       | ci(.*)          | \CodeIgniter\CLI\CommandRunner::index/$1 |                |               |
| GET(auto) | product/list/.. | \App\Controllers\Product::getList        |                | toolbar       |
+-----------+-----------------+------------------------------------------+----------------+---------------+

spark db:table コマンド

データベース内のテーブルの情報を表示する spark db:table コマンドが追加されました。

$ php spark db:table --show

CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-04 04:18:24 UTC+00:00

The following is a list of the names of all database tables:

+----+------------+-------------+---------------+
| ID | Table Name | Num of Rows | Num of Fields |
+----+------------+-------------+---------------+
| 1  | migrations | 1           | 7             |
| 2  | news       | 3           | 4             |
+----+------------+-------------+---------------+
$ php spark db:table news

CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-04 04:19:03 UTC+00:00

Data of Table "news":

+----+--------------------+--------------------+--------------------------+
| id | title              | slug               | body                     |
+----+--------------------+--------------------+--------------------------+
| 1  | Elvis sighted      | elvis-sighted      | Elvis was sight...       |
| 2  | Say it isn't so... | say-it-isnt-so     | Scientists conc...       |
| 3  | Caffeination, Y... | caffeination-ye... | World's largest...       |
+----+--------------------+--------------------+--------------------------+
$ php spark db:table news --metadata

CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-04 04:20:37 UTC+00:00

List of Metadata Information in Table "news":

+------------+---------+------------+----------+---------+-------------+
| Field Name | Type    | Max Length | Nullable | Default | Primary Key |
+------------+---------+------------+----------+---------+-------------+
| id         | INTEGER |            | Yes      |         | Yes         |
| title      | VARCHAR |            | No       |         | No          |
| slug       | VARCHAR |            | No       |         | No          |
| body       | TEXT    |            | No       |         | No          |
+------------+---------+------------+----------+---------+-------------+

$this->validateData()

指定したデータを検証する $this->validateData() メソッドがコントローラに追加されました。

$data = [
    'id'   => $id,
    'name' => $this->request->getVar('name'),
];

$rule = [
    'id'   => 'integer',
    'name' => 'required|max_length[255]',
];

if (! $this->validateData($data, $rule)) {
    return view('store/product', [
        'errors' => $this->validator->getErrors(),
    ]);
}

バリデーションの Strict Rules

バリデーションに厳密な Strict Rules が追加されました(オブトイン)。

詳細は、 CodeIgniter4のバリデーション を参照してください。

Preloading

コードの事前ロードのためのサンプルファイル preload.php が追加されました。

この記事は CodeIgniter Advent Calendar 2022 - Qiita の4日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

参考

Date: 2022/12/04

Tags: codeigniter, codeigniter4