モジュラーディレクトリ構造の規約 (The Conventional Modular directory structure) により、さまざまな MVC アプリケーションを自己完結した単位にまとめることができます。 また、それをさまざまなフロントコントローラで再利用できるようになります。 このディレクトリ構造は、次のようになります。
docroot/ index.php application/ controllers/ IndexController.php FooController.php blog/ controllers/ IndexController.php models/ views/ news/ controllers/ IndexController.php ListController.php models/ views/
この考え方では、モジュール名が、 その中に含まれるコントローラのプレフィックスとなります。 上の例には、三つのモジュールコントローラ 'Blog_IndexController'、'News_IndexController' および 'News_ListController' が含まれます。また、グローバルコントローラも 'IndexController' と 'FooController' の二つが定義されています。 これらは名前空間に属しません。この章のサンプルでは、 ここで示したディレクトリ構造を使用します。
それでは、Zend Framework の MVC コンポーネントを使用して これらのディレクトリ配置を実装するにはどうすればいいのでしょうか?
モジュールを使用するための第一歩となるのが、 フロントコントローラでのコントローラディレクトリの設定方法を変更することです。 基本的な MVC 版では、配列あるいは文字列を setControllerDirectory() に渡すか、あるいはパスを addControllerDirectory() に渡していました。モジュールを使用する場合は、 これらのメソッドコールを少々変更する必要があります。
setControllerDirectory() では、連想配列を渡す必要があります。 連想配列のキーにはモジュール名、そしてその値としてディレクトリのパスを指定します。 特別な名前 'default' をキーにすると、グローバルコントローラ (モジュール名前空間を必要としないもの) を指定できます。 すべてのエントリは、ひとつのパスをさす文字列のキーを含まなければなりません。 次の例のようになります。
$front->setControllerDirectory(array( 'default' => '/path/to/application/controllers', 'blog' => '/path/to/application/blog/controllers' ));
addControllerDirectory() では、オプションの二番目の引数を受け付けます。 モジュールを使用する際には、モジュール名を二番目の引数で渡します。 指定しない場合は、そのパスはデフォルトの名前空間に追加されます。 次の例のようになります。
$front->addControllerDirectory('/path/to/application/news/controllers', 'news');
Zend_Controller_Router_Rewrite
のデフォルトのルートは
Zend_Controller_Router_Route_Module
型のオブジェクトです。
このルートは、以下のいずれかの形式のルーティングを行います。
:module/:controller/:action/*
:controller/:action/*
言い換えると、これは、指定したコントローラとアクション あるいはその先頭にモジュールをつけたものにマッチします。 このマッチング規則からわかることは、 フロントコントローラとディスパッチャに渡された配列で指定した コントローラディレクトリの配列に同名のキーがある場合にのみ モジュールにマッチするということです。
デフォルトのルータでは、コントローラが URL で指定されなかった場合には
デフォルトのコントローラ (特に指定しなければ IndexController
)
を使用します。モジュール対応のコントローラにおいて、
モジュールのみを指定してコントローラを指定しなかった場合は、
ディスパッチャはまず最初にモジュールパス内のデフォルトコントローラを探します。
次に、グローバル名前空間 'default' にあるデフォルトコントローラを探します。
デフォルトは常にグローバル名前空間のほうにしたい場合は、
フロントコントローラでパラメータ
useGlobalDefault
を指定します。
$front->setParam('useGlobalDefault', true);