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.php
と spark
が変更されたため、それらを更新しないと、全く動作しなくなりますので、注意してください。
アップグレード手順の例:
$ 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とコントローラメソッドが必ず一対一で対応するようになっています。
以下の記事も参照してください。
- 【改訂版】CodeIgniter4のルーティング
- 【改訂版】本当は危ないCodeIgniter4の自動ルーティング
- CodeIgniter 4.2.0 で導入された新しい自動ルーティングについて | そど
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