CodeIgniter4のモジュール(HMVC)①

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

モジュールとは?

CodeIgniter4のモジュールとは、コードをモジュール化する仕組みです。

1つのモジュールの中に関連するMVCファイルや設定ファイル、ヘルパー、言語ファイルなどをまとめることができます。 モジュールは小さなアプリと考えることができます。

├── app/
│   ├── Config/
│   ├── Controllers/
│   ├── Database/
│   ├── Filters/
│   ├── Helpers/
│   ├── Language/
│   ├── Libraries/
│   ├── Models/
│   └── Views/
└── modules/Blog/src/
     ├── Commands/
     ├── Config/
     ├── Controllers/
     ├── Database/
     ├── Filters/
     ├── Language/
     ├── Models/
     └── Views/

なお、HMVCという言葉を使っていないのは、HMVCの定義が人によって異なるためだと思われます。

CodeIgniter4のモジュールは、CodeIgniter3で有名だった wiredesignz のHMVCとは異なるものです。

Homeモジュールを作成してみる

とりあえず、実際にモジュールを作成してみましょう。

デフォルトの Home コントローラをモジュール化してみます。

フォルダの作成

modules/Home/src フォルダを作成します。

その中に ConfigControllersViews フォルダを作成してください。

modules/
└── Home/
   └── src/
     ├── Config/
     ├── Controllers/
     └── Views/

ここでは、将来、tests フォルダをこのモジュールに含めることを見越して、ソースファイルは src フォルダの中に配置することにします。

オートローダーの設定

PSR-4の名前空間 Home を追加します。

app/Config/Autoload.php

    public $psr4 = [
        APP_NAMESPACE => APPPATH, // For custom app namespace
        'Config'      => APPPATH . 'Config',
        'Home'        => ROOTPATH . 'modules/Home/src', // ← 追加する
    ];

sparkコマンドで設定を確認しておきましょう。

$ php spark namespaces

CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-12 23:08:22 UTC-06:00

+-------------+------------------------------------------------------------+--------+
| Namespace   | Path                                                       | Found? |
+-------------+------------------------------------------------------------+--------+
| CodeIgniter | /.../ci4-modules-test/vendor/codeigniter4/framework/system | Yes    |
| App         | /.../ci4-modules-test/app                                  | Yes    |
| Config      | /.../ci4-modules-test/app/Config                           | Yes    |
| Home        | /.../ci4-modules-test/modules/Home/src                     | Yes    |
+-------------+------------------------------------------------------------+--------+

名前空間 Home が正しく追加されています。

コントローラ

app/Controllers/Home.phpmodules/Home/src/Controllers/Home.php に移動して、 名前空間を変更します。

<?php

namespace Home\Controllers;

use App\Controllers\BaseController;

class Home extends BaseController
{
    public function index()
    {
        return view('Home\Views\welcome_message');
    }
}

ビューファイルは Home\Views 名前空間に移動するため、パスを変更しておきます。

ルーティング設定

app/Config/Routes.php にある既存のルートを削除しておきます。

--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -33,10 +33,6 @@ $routes->set404Override();
  * --------------------------------------------------------------------
  */

-// We get a performance increase by specifying the default
-// route since we don't have to scan directories.
-$routes->get('/', 'Home::index');
-
 /*
  * --------------------------------------------------------------------
  * Additional Routing

モジュールの中にルート設定ファイルを追加して / へのルートを設定します。

modules/Home/src/Config/Routes.php

<?php

namespace Home\Config;

$routes->get('/', [\Home\Controllers\Home::class, 'index']);

ビュー

app/Views/welcome_message.phpmodules/Home/src/Views/welcome_message.php に移動します。

これで、Homeモジュールが完成しました。

modules/
└── Home/
   └── src/
     ├── Config/
     │   └── Routes.php
     ├── Controllers/
     │   └── Home.php
     └── Views/
         └── welcome_message.php

Homeモジュールの動作確認

sparkコマンドでルーティング設定を確認しておきましょう。

$ php spark routes

CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-12 22:59:15 UTC-06:00

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

きちんと、Homeモジュールの中のコントローラになっています。

php spark serve を実行し、http://localhost:8080/ にアクセスすれば、CodeIgniterのWelcomeページが表示されます。

CodeIgniter4のモジュール(HMVC)②」へ続く。

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

参考

Date: 2022/12/14

Tags: codeigniter, codeigniter4