モジュール

モジュールとは?

モジュールとは、独立した MVC 要素のグループのことです。モジュールを使うと、コードを再利用しカプセル化することが可能になります。 モジュールは、通常、アプリケーションディレクトリの下の modules ディレクトリに置かれます。 結構な量のコードをもつ大きなプロジェクトを動かしている場合、 モジュールを使ってみてはいかがでしょうか。 モジュールは、物事をきちんと秩序立てて整理する助けになるでしょう。

例えばブログモジュールやアルバムモジュールのように、モジュールは独立して動作させることが可能です。グローバルなコードに対するいかなるアクセスも行わず、モジュールのコントローラに対して直接ルーティングすることが出来ます。 モジュールは、純粋な HMVC コンテクストの中で使うことも出来ます。その場合、ページ生成に必要な諸結果 (の一部) を得るために、コントローラは別のコントローラを呼び出すことが出来ます。

モジュールの設定

利用にあたっては、モジュールの存在を Fuel 自身に教えてあげる必要があります。 デフォルトでは、モジュールはアプリケーションの modules フォルダの中に存在します。また、アプリケーションの config.php の中で 'modules_path' を設定することも出来ます。 複数のパスを設定することも出来ます。設定したパスはその順に検索されます。

/**
 * uri の冒頭セグメント名によって経路付けられるモジュールを
 * アプリケーションから分離出来るようにするためには、
 * 下記のように、それぞれ basepath を記述する必要があります。
 */
'module_paths' => array(
	APPPATH.'modules'.DS,		// アプリケーションモジュールのパス
	APPPATH.'..'.DS.'globalmods'.DS	// グローバルモジュールのパス
),

パス設定するときには、OS プラットフォーム毎に対応している Fuel のディレクトリセパレータ定数 DS を、それぞれパスの末尾に付けるのを忘れないでください。

モジュールの名前空間

それぞれ独自に開発しているコード間のクラス名が衝突してしまう、というような問題に出くわすことがあります。たとえば、多くのモジュールが 1 つの管理コントローラのもとにある場合が、それにあたります。Fuel では、名前衝突を避けるために全モジュールが PHP の名前空間のもとで動作するようになっています。名前空間は 必ず 当該モジュールフォルダ名と同一でなければなりません。

<?php
/**
 * Mymodule モジュールの中でのモジュールコントローラ
 */

namespace Mymodule;

class Controller_Widget
{

	// ここに、たとえばアプリケーションコントローラのようなコントローラのコードを書きます。
}

もしここの例にあるようにコントローラを名前空間の中に移動したのならば、 同様の設定をモジュールのコントローラにもしなければなりません。今回のサンプルでいうならば、名前空間は Mymodule\Controller でクラス名は Widget となります。

モジュールフォルダの構造

新しいモジュールを作る時に最初にやるべきことは、設定ファイルでパスを設定したモジュールフォルダの中にフォルダを作ることです。 フォルダの名前は、モジュール名とモジュール各クラスのための名前空間となります。 また、モジュールのコントローラにルート(経路)付けたい時やHMVCからの呼び出しがあった場合の Request の一部として、URI 内でその名前が使われることがあります。

モジュールはそれ自身の中にアプリケーションを包含している、と見なすことができます。モジュールフォルダの構造は慣れ親しんだものであることにあなたは気づくでしょう。 モジュールのフォルダ構造はアプリケーションフォルダのそれと同じなのです。下記のフォルダ構造がモジュールでサポートされています:

モジュール間のファイル横断読み込み

設定ファイルであろうとビューファイルであろうと、モジュールを横断した読み込みを行う場合は、 モジュール名をファイル名プレフィックスに付け加えなければなりません:

// config のモジュール横断読み込み
\Config::load('othermodule::myconfig');

// ビューのモジュール横断読み込み
\View::forge('othermodule::subdir/view');

モジュールからタスクを実行します:

$ php oil refine <modulename>::<taskname>:<methodname>

モジュールルーティング

モジュールでルーティングを行う場合、モジュールの config フォルダ内に routes.php を含めることで、独自のルートを加えることが出来ます。 Fuel が、URI の最初のセグメントがモジュールを指示していることを検出すると、そのモジュールの経路のみが読み込まれます。 モジュールで設定したルートは、メインルート設定で設定されているかもしれない (:any) のルートが、モジュールのルーティングの前にマッチしてしまわないように、ルート配列の冒頭に追加されます。

上の点は、次のことを意味しています。すなわち、モジュールで設定されたルートはグローバルルーティングや他のモジュールのルートを定義するために使うことは出来ない、ということです。 別の言い方をしましょう。ルート設定 (配列) の左辺は、URI の最初のセグメントに現行モジュールが常に含まれていなければならない、ということです。 右辺は、他の各節で書いたのと同様で、どのようなものでも記述可能です。 アプリケーションコントローラあるいは他のモジュールに対するルートを設定することは完全に可能です。

モジュールと HMVC リクエスト

アプリケーションから論理的に独立分離したモジュールを作るという場合を除けば、 モジュールのコントローラを HMVC コンテキストの中で使うことも可能です。 そのコンテキストにおいては、リクエストされた URI による最終生成物を作るためにアプリケーションのコントローラの 1 つが他のモジュールコントローラの 1 つを呼び出します。

この点については更に、HMVC リクエストのドキュメント を参照ください。

モジュールの外部で、他のモジュールのクラスを使う

当然のことですが、モジュールのクラスをモジュールの外部で使うことも可能です。 そのためには、そのクラスの自動読み込みを Fuel が出来るようになっていなければなりません。 これは、モジュールがどこにあるのか Fuel に教えておく必要がある、ということを意味します。読み込み方法としては、2 つの方法があります。

1 つは、'always_load' で読み込むモジュールを特定することで予めモジュールを読み込む方法で、 アプリケーションの config.php ファイルで 'modules' を設定する方法です:

'always_load' => array(

	/**
	 * これらのモジュールは Fuel が動作開始する時に常に読み込まれます。
	 * 次のような方法でモジュール指定をすることが可能です:
	 *
	 * array('module_name');
	 *
	 * パスは module_paths として動作するように設定されていなければなりません。
	 */
	'modules'	=> array('mymodule'),

2 つ目の方法として、モジュールの静的メソッドを使う前に、モジュールをその都度付け加える方法です。:

// MyModule モジュールにアクセスできるようにします
Module::load('mymodule');

そうすれば、次のようにモジュールのクラスを呼び出すことが出来ます

\Mymodule\Myclass::mymethod('params');