CodeIgniter4のモジュール(HMVC)②

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

CodeIgniter4のモジュール(HMVC)①」の続きです。

モジュールの実装

CodeIgniter4のモジュールは、名前空間をベースにコードをまとめるものです。

1つのPSR-4の名前空間が1つのモジュールになります。

これは、名前空間をCodeIgniter4のオートローダーの設定ファイルに追加してもいいですし、Composerパッケージで設定してもOKです。

つまり、Composerパッケージはモジュールとして使えます。というか、デフォルトでは全てのComposerパッケージがモジュールとして扱われます。

名前空間の中にコードをまとめるだけなら、そのようにコードを配置して、名前空間を指定して呼び出せばいいだけです。 PSR-4オートローダーがあれば、他には特に必要ありません。

しかし、それだけでは不便なのでフレームワークの機能としてモジュールを簡単に扱えるようにしています。

オートディスカバリー

オートディスカバリーとは、モジュールのファイルを自動的に検出する機能です。

デフォルトでは以下のファイルが自動的に検出されます。

前回、modules/Home/src/Config/Routes.php を用意しただけでルーティングが登録されたのは、このオートディスカバリーの機能によります。

オートディスカバリーは app/Config/Modules.php で項目別にオフに設定することができます。

Factories (config() と model())

Factories はデフォルトでは preferApptrue に設定されています。

これは、モジュール内のクラスを App にあるクラスで置き換えるための機能です。

クラスをロードする際に、同じショートネームのクラスが App 名前空間に存在すると、そちらが優先されます。

例えば、App\Models\UserModelBlog\Models\UserModel があった場合、以下のコードはどちらも App\Models\UserModel をロードします。

$users = Factories::models('UserModel');
$users = Factories::models(\Blog\Models\UserModel::class);

(2023-08-17 追記) この完全修飾クラス名を指定しても App 名前空間にあるクラスがロードされるという、わかりづらい振る舞いは、 v4.4.0 から変更される予定です。デフォルトでは指定したクラスがロードされるようになります。

Blog\Models\UserModel をロードしたい場合は、以下のように preferAppfalse に指定する必要があります。

$users = Factories::models('Blog\Models\UserModel', ['preferApp' => false]);

この場合、model() 関数には preferApp を変更するオプションはありませんので、Blog\Models\UserModel はロードできないことになります。

(2023-08-17 追記) この完全修飾クラス名を指定しても App 名前空間にあるクラスがロードされるという、わかりづらい振る舞いは、 v4.4.0 から変更される予定です。デフォルトでは指定したクラスがロードされるようになります。

helper()

helper() 関数は、モジュールの名前空間を指定することで、そのモジュールにあるヘルパーだけをロードできます。

helper('Blog\Helpers\blog');

名前空間を指定しない場合は、定義された全ての名前空間にある同じ名前のヘルパーファイルがロードされます。

view()

view() 関数は、モジュールの名前空間を指定することで、そのモジュールにあるビューをロードできます。

view('Blog\Views\blog_view');

名前空間を指定しない場合は、App\Views 以下のファイルがロードされます。

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

関連

参考

Date: 2022/12/15

Tags: codeigniter, codeigniter4