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 はデフォルトでは preferApp
が true
に設定されています。
これは、モジュール内のクラスを App
にあるクラスで置き換えるための機能です。
クラスをロードする際に、同じショートネームのクラスが App
名前空間に存在すると、そちらが優先されます。
例えば、App\Models\UserModel
と Blog\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
をロードしたい場合は、以下のように preferApp
を false
に指定する必要があります。
$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