A Day in Serenity (Reloaded)

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

A Day in Serenity (Reloaded) PHP, CodeIgniter, FuelPHP, Linux or something

Links

著書

[フレーム] [フレーム] [フレーム] [フレーム]

はじめてのフレームワークとしてのFuelPHP第2版(1) 環境構築編 はじめてのフレームワークとしてのFuelPHP第2版(2) 入門編

はじめてのフレームワークとしてのFuelPHP第2版(3) 実践編 徹底攻略PHP5技術者認定[上級]試験問題集 [PJ0-200]対応

FuelPHPに関する無料電子書籍

FuelPHP Advent Calendar 2013 FuelPHP Advent Calendar 2012

AltStyle によって変換されたページ (->オリジナル) /