CodeIgniter4のプロジェクトファイルを簡単にアップグレードする

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

プロジェクトファイルの更新とは?

CodeIgniter4(フレームワーク)のアップグレードは、composer update でコマンド一発でできますが、systemフォルダ以外のプロジェクトファイルは必要に応じて手動で更新する必要があります。

プロジェクトファイルとは、要するに、vendor フォルダ以外のプロジェクト内のファイルのことです。

基本的には、マイナーバージョンアップではプロジェクトファイルを更新しなくても動作するはずですが、例外もあります。

例えば、4.2.0 では、index.phpspark が変更されたため、これらをアップグレードしないとシステムが全く動作しなくなりました。

更新が必要な場合は、ユーザガイドに記載されています。

とはいえ、手動で更新するのは面倒です。そこで、プロジェクトファイルの更新を自動化するツールを使います。

Tatter\Patches のインストール

まず、自動化ツールである Tatter\Patches をインストールします。

動作には、Git と shell が必要です。

$ composer require --dev tatter/patches

Tatter\Patches は vendoring(vendor/ 以下をGit管理すること)していると正常に動作しません。

4.1.9 を最新バージョンにアップグレードする

実際に、4.1.9 を最新の 4.2.10 にアップグレードしてみます。

まず、コミットされていない変更点があれば、コミットしてGitのワーキングツリーをクリーンな状態にします。

$ git add -u
$ git commit

patch の実行

それでは、patchコマンドを実行します。

$ vendor/bin/patch
git version 2.38.1
Composer version 2.4.4 2022-10-27 14:39:29
************************************
*          CONFIGURATION           *
************************************

Scripts Directory: /.../ci-app/vendor/tatter/patches/src
Project Directory: /.../ci-app
Target Version:    
Current Version:   
Source Package:    codeigniter4/framework
Base Branch:       main
Selected Items:    app/ public/ env spark

************************************
*             STAGING              *
************************************

Switched to a new branch 'tatter/scratch'
Loading composer repositories with package information
https://repo.packagist.org could not be fully loaded (curl error 6 while downloading https://repo.packagist.org/packages.json: Could not resolve host: repo.packagist.org), package information was loaded from the local cache and may be out of date
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading codeigniter4/framework (v4.1.9 => v4.2.10)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Upgrading codeigniter4/framework (v4.1.9 => v4.2.10): Extracting archive
Generating autoload files
28 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
infection/extension-installer: No extensions found
No security vulnerability advisories found
[tatter/scratch f7d71df] Patch framework
 28 files changed, 1136 insertions(+), 1001 deletions(-)
Switched to a new branch 'tatter/patches'
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 0 installs, 1 update, 0 removals
  - Downgrading codeigniter4/framework (v4.2.10 => v4.1.9): Extracting archive
Generating autoload files
28 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
************************************
*              MERGING             *
************************************

Auto-merging app/Config/Paths.php
[tatter/patches 3eb6855] Patch framework
 Date: Mon Dec 5 09:53:57 2022 +0900
 28 files changed, 1136 insertions(+), 1001 deletions(-)
************************************
*              SUCCESS             *
************************************

Patch successful! Updated files are available on branch tatter/patches.
Deleted branch tatter/scratch (was f7d71df).

成功しました。

現在、tatter/patchesブランチにいる状態です。

コンフリクトが発生した場合

なお、コンフリクトが発生しマージが失敗する可能性もあります。

その場合は、手動でコンフリクトを解消し、git add して、 git cherry-pick --continue してください。

codeigniter4/framework の更新

codeigniter4/framework はまだ 4.1.9 のままなので更新します。

$ composer update
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading codeigniter4/framework (v4.1.9 => v4.2.10)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Upgrading codeigniter4/framework (v4.1.9 => v4.2.10): Extracting archive
Generating autoload files
28 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
infection/extension-installer: No extensions found
No security vulnerability advisories found

これで、最新の 4.2.10 にアップグレードされました。動作可能なはずです。

sparkコマンドを実行してバージョンを確認してみましょう。

$ php spark

CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-06 19:00:29 UTC-06:00
...

動きました。

更新内容の確認

変更内容に問題ないか確認します。 テストがあれば実行してください。

Gitで差分を確認してください。

$ git diff main...HEAD
$ git diff main...HEAD --name-only app/Config/
app/Config/App.php
app/Config/Constants.php
app/Config/ContentSecurityPolicy.php
app/Config/Database.php
app/Config/Events.php
app/Config/Feature.php
app/Config/Filters.php
app/Config/Format.php
app/Config/Logger.php
app/Config/Mimes.php
app/Config/Paths.php
app/Config/Publisher.php
app/Config/Routes.php
app/Config/Security.php
app/Config/Validation.php
app/Config/View.php

設定ファイルが更新されていることがわかります。

なお、バージョンアップに伴い設定ファイルのデフォルト値が変更されている場合があります。そのような変更も自動的に適用されています。

フレームワークの動作が変わり、場合によりアプリが期待したように動作しなくなる可能性があります。設定値の差分を確認し、必要であれば元の値に戻すようにしてください。

public/index.php の差分を確認してみましょう。

$ git diff main...HEAD public/index.php
diff --git a/public/index.php b/public/index.php
index 7737302..96e7f45 100644
--- a/public/index.php
+++ b/public/index.php
@@ -1,8 +1,23 @@
 <?php

+// Check PHP version.
+$minPhpVersion = '7.4'; // If you update this, don't forget to update `spark`.
+if (version_compare(PHP_VERSION, $minPhpVersion, '<')) {
+    $message = sprintf(
+        'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s',
+        $minPhpVersion,
+        PHP_VERSION
+    );
+
+    exit($message);
+}
+
 // Path to the front controller (this file)
 define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR);

+// Ensure the current directory is pointing to the front controller's directory
+chdir(FCPATH);
+
 /*
  *---------------------------------------------------------------
  * BOOTSTRAP THE APPLICATION
@@ -12,20 +27,34 @@ define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR);
  * and fires up an environment-specific bootstrapping.
  */

-// Ensure the current directory is pointing to the front controller's directory
-chdir(__DIR__);
-
 // Load our paths config file
 // This is the line that might need to be changed, depending on your folder structure.
-$pathsConfig = FCPATH . '../app/Config/Paths.php';
-// ^^^ Change this if you move your application folder
-require realpath($pathsConfig) ?: $pathsConfig;
+require FCPATH . '../app/Config/Paths.php';
+// ^^^ Change this line if you move your application folder

 $paths = new Config\Paths();

 // Location of the framework bootstrap file.
-$bootstrap = rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
-$app       = require realpath($bootstrap) ?: $bootstrap;
+require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
+
+// Load environment settings from .env files into $_SERVER and $_ENV
+require_once SYSTEMPATH . 'Config/DotEnv.php';
+(new CodeIgniter\Config\DotEnv(ROOTPATH))->load();
+
+/*
+ * ---------------------------------------------------------------
+ * GRAB OUR CODEIGNITER INSTANCE
+ * ---------------------------------------------------------------
+ *
+ * The CodeIgniter class contains the core functionality to make
+ * the application run, and does all of the dirty work to get
+ * the pieces all working together.
+ */
+
+$app = Config\Services::codeigniter();
+$app->initialize();
+$context = is_cli() ? 'php-cli' : 'web';
+$app->setContext($context);

 /*
  *---------------------------------------------------------------
@@ -34,4 +63,5 @@ $app       = require realpath($bootstrap) ?: $bootstrap;
  * Now that everything is setup, it's time to actually fire
  * up the engines and make this app do its thang.
  */
+
 $app->run();

更新されていることがわかります。

Tatter\Patchesは、存在していなかったディレクトリにファイルが追加されると、プロジェクトのルートにそのファイルを追加します。

古いバージョンからアップグレードすると、Language/en/Validation.php が追加されるので、正しい位置(app/Language/en/)に移動してください。

変更内容のマージ

問題がなけば、メインのブランチにマージします。

$ git checkout main
$ git merge tatter/patches

これで完了です。

tatter/patchesブランチは削除してください。

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

参考

Tags: codeigniter, codeigniter4

【改訂版】CodeIgniter4のルーティング

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

CodeIgniter4のルーティングについて解説します。

手動ルーティング

CodeIgniter 4.2.0 から、セキュリティ上の理由で、すべてのルートを設定ファイルに定義する「手動ルーティング」がデフォルトになりました。 詳細は、「【改訂版】本当は危ないCodeIgniter4の自動ルーティング」を参照してください。

コントローラがあるだけではルーティングされないため、ルートを定義しない限りコントローラにアクセスできません。定義されていないURLにアクセスしても 404 ページが表示されます。

HTTPメソッドでのルーティング

ルートは、app/Config/Routes.php に設定します。

特定のHTTPメソッドを指定してルートを設定することができます。

GETメソッドの場合は、$routes->get() を使用します。

$routes->get('news', [\App\Controllers\News::class, 'index']);

上記は、http://example.com/news にアクセスすると、News コントローラの index() メソッドが呼び出されます。

POSTメソッドの場合は、$routes->post() を使用します。

$routes->post('news/create', [\App\Controllers\News::class, 'create']);

上記は、http://example.com/news/create にアクセスすると、News コントローラの create() メソッドが呼び出されます。

$routes->put()$routes->delete() なども同様です。

URLの一部をキャプチャ

(:segment)(:num)(:any) などのプレースホルダーを使います。

(:segment) は1つのURIセグメント、(:num) は数字だけの1つのセグメント、(:any) は任意の文字列にマッチします。

$routes->get('news/(:segment)', [\App\Controllers\News::class, 'view']);

上記は、/news/foo にアクセスすると、News コントローラの view() メソッドの第1引数に foo を渡し、呼び出します。

ルートのグループ化

ルートをグループ化することもできます。

$routes->group('admin', function ($routes) {
    $routes->get('users', [\App\Controllers\Admin\Users::class, 'index']);
    $routes->get('blog',  [\App\Controllers\Admin\Blog::class, 'index']);
});

上記は、admin/usersadmin/blog のルートを設定しています。

コントローラフィルターの適用

ルートに対してコントローラフィルターを指定することもできます。

以下は、login というフィルターをルートに適用するサンプルです。

$routes->post('news/create', [\App\Controllers\News::class, 'create'], ['filter' => 'login']);
$routes->group('admin', ['filter' => 'login'], function ($routes) {
    $routes->get('users', [\App\Controllers\Admin\Users::class, 'index']);
    $routes->get('blog',  [\App\Controllers\Admin\Blog::class, 'index']);
});

名前付きルート

オプションでルートに名前を付けることができます。

$routes->get(
    'users/(:num)/gallery/(:num)',
    [\App\Controllers\Galleries::class, 'showUserGallery'],
    ['as' => 'user-gallery']
);

ビューで以下のように使えます。

<a href="<?= url_to('user-gallery', 15, 12) ?>">ギャラリーを表示する</a>
<!-- 結果: 'http://example.com//users/15/gallery/12' -->

名前付きルートを使うと、ビューを変更せずに簡単にルートを変更することができます。

ルート設定の確認

spark routes コマンドで設定したルートを確認することができます。

$ php spark routes
CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-05 20:17:56 UTC-06:00

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

デフォルトでは上記のルートが設定されています。ルートは上から順に評価され、マッチすればそのメソッドが実行されます。

なお、CLI はコマンドライン用の特殊なルートです。

自動ルーティング(改善)

CodeIgniter 4.1.x までデフォルトだった自動ルーティングは、あまりにも簡単に脆弱性を作り込んでしまうため、 4.2.0 からより安全な「自動ルーティング(改善)」が追加されました。

自動ルーティング(改善)を有効にする

自動ルーティング(改善)を有効にするには、app/Config/Routes.phpapp/Config/Feature.php の 2箇所で設定する必要があります。

app/Config/Routes.php

$routes->setAutoRoute(true);

app/Config/Feature.php

    public bool $autoRoutesImproved = true;

$autoRoutesImprovedfalse だと、自動ルーティング(レガシー)になります。

自動ルーティング(改善)の基本

自動ルーティング(改善)は、基本的に以下の規約で自動的にルーティングします。

http://example.com/{コントローラ名}/{メソッド名(HTTP動詞を除く)}/{引数1}/{引数2}/...

以下の Newsコントローラを作成します。

<?php

namespace App\Controllers;

class News extends BaseController
{
    public function getTest($p1 = 'x', $p2 = 'x')
    {
        return '$p1: ' . esc($p1) . ', $p2: ' . esc($p2);
    }
}

すると、以下のルートが自動的に定義されます。

+-----------+---------------------+------------------------------------------+----------------+---------------+
| Method    | Route               | Handler                                  | Before Filters | After Filters |
+-----------+---------------------+------------------------------------------+----------------+---------------+
| GET(auto) | news/test[/..][/..] | \App\Controllers\News::getTest           |                | toolbar       |
+-----------+---------------------+------------------------------------------+----------------+---------------+

getTest()メソッドの最初の get はHTTPメソッド(HTTP動詞)です。この場合はGETメソッドでこのルートにアクセスできることになります。

例えば、POSTメソッドでアクセスさせたい場合は、postTest()メソッドを定義する必要があります。

php spark serve コマンドを実行し、 http://localhost:8080/news/test/a/b にブラウザからアクセスすると、以下が表示されます。

$p1: a, $p2: b 

http://localhost:8080/news/test/a にアクセスすると、以下が表示されます。

$p1: a, $p2: x

http://localhost:8080/news/test にアクセスすると、以下が表示されます。

$p1: x, $p2: x

http://localhost:8080/news/test/a/b/c にアクセスすると、404 - File Not Found が表示されます。 引数の数が合わないからです。

デフォルトメソッド

http://localhost:8080/news でアクセス可能にするには、以下のように getIndex() メソッドを追加します。

<?php

namespace App\Controllers;

class News extends BaseController
{
    // ...

    public function getIndex()
    {
        return __METHOD__;
    }
}

これで http://localhost:8080/news にアクセスすると、以下が表示されます。

App\Controllers\News::getIndex

このようにURLの {メソッド名(HTTP動詞を除く)} の部分を省略したときに実行されるメソッドを「デフォルトメソッド」と言います。 デフォルトでは index が設定されています。

デフォルトコントローラ

http://localhost:8080/ のように {コントローラ名} がないURLにアクセス可能にするには、以下のように Homeコントローラを作成します。

<?php

namespace App\Controllers;

class Home extends BaseController
{
    public function getIndex()
    {
        return view('welcome_message');
    }
}

しかし、デフォルトでは app/Config/Routes.php/ へのルート(以下)が定義されています。

$routes->get('/', 'Home::index');

定義済みのルートは自動ルーティングより優先されるので、Home::index()メソッドが存在しないため、404 - File Not Found になります。

そこで、上記のルートの定義をコメントアウトしてください。

//$routes->get('/', 'Home::index');

これで、http://localhost:8080/ に自動ルーティング(改善)によりアクセス可能になります。

自動ルーティング(改善)の規約

規約をまとめておきます。

  • URLは基本的にはすべて小文字を想定
  • URLでの {コントローラ名} はすべて小文字、実際のクラス名は先頭のみ大文字
    • サブフォルダを使う場合は、サブフォルダ名も先頭のみ大文字
  • メソッド名には getIndex()postCreate() のようにHTTP動詞のプリフィックスが必要
    • http://example.com/news/create にGETメソッドでリクエストした場合、NewsコントローラのgetCreate()メソッドが実行される
  • メソッド名が省略されたURLの場合、デフォルトメソッド(デフォルトではindex)があれば実行される
    • http://example.com/news にGETメソッドでリクエストした場合、NewsコントローラのgetIndex()メソッドが実行される
  • トップページへのリクエストの場合、デフォルトコントローラ(デフォルトでは Home)が実行される
    • http://example.com/ にGETメソッドでリクエストした場合、HomeコントローラのgetIndex()メソッドが実行される
  • デフォルトコントローラとデフォルトメソッドはURLの中で必ず省略する必要がある
    • http://example.com/ にはアクセス可能だが http://example.com/home には 404 が返る
    • http://example.com/news にはアクセス可能だが http://example.com/news/index には 404 が返る
  • メソッドのパラメータ数がチェックされる
    • パラメータ数が一致しない場合は 404 が返る
  • 手動ルーティングで定義されているコントローラには一切アクセスできない
    • 手動ルーティングするコントローラと自動ルーティングするコントローラは厳密に区別される
    • News::index() へのルートが手動ルーティングで設定されている場合、News::getCreate() メソッドを追加してnews/create にアクセスしても 404 が返る
  • _remap() メソッドはサポートされない

自動ルーティング(レガシー)

CodeIgniter 4.1.x までは、デフォルトで以下の規約で自動的にルーティングされていました。 これは CodeIgniter3 の自動ルーティングと同じものです。

http://example.com/{コントローラ名}/{メソッド名}/{引数1}/{引数2}/...

この機能は現在では「自動ルーティング(レガシー)」と呼ばれています。

セキュリティ上の問題があるため、デフォルトでは無効になっています。

自動ルーティング(レガシー)を有効にする

自動ルーティング(レガシー)を有効にするには、 app/Config/Routes.php で以下を設定します。

app/Config/Routes.php

$routes->setAutoRoute(true);

セキュリティ上の理由から、自動ルーティング(レガシー)は推奨しません。できる限りオフに設定してください。

自動ルーティング(レガシー)を有効にすると、デフォルトでは以下のルートがあることがわかります。

+--------+------------------+------------------------------------------+----------------+---------------+
| Method | Route            | Handler                                  | Before Filters | After Filters |
+--------+------------------+------------------------------------------+----------------+---------------+
| GET    | /                | \App\Controllers\Home::index             |                | toolbar       |
| CLI    | ci(.*)           | \CodeIgniter\CLI\CommandRunner::index/$1 |                |               |
| auto   | /                | \App\Controllers\Home::index             |                | toolbar       |
| auto   | home             | \App\Controllers\Home::index             |                | toolbar       |
| auto   | home/index[/...] | \App\Controllers\Home::index             |                | toolbar       |
+--------+------------------+------------------------------------------+----------------+---------------+

/ へのルートは MethodGET のルート(1行目)と auto のルート(3行目)の 2つあります。リクエストが GET / の場合、GET のルートが上にあるため、auto のルートは実際には使われません。しかし、リクエストが POST / の場合は auto のルートがマッチします。

Methodauto のルートは自動ルーティング(レガシー)であることを示し、 あらゆるHTTPメソッドでアクセス可能です。

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

関連

参考

Tags: codeigniter, codeigniter4

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日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

参考

Tags: codeigniter, codeigniter4