ZendFrameworkにおけるモジュール
大規模なWEBアプリケーションになると、ファイルの数も相当数あり、それらの管理が大変になります。
たとえば、ZendFrameworkでWEBアプリを構築している場合は、controllers(アクションコントローラ格納ディレクトリ)直下のファイル数がだんだん多くなっていき、メンテナンス性が低下するおそれがあります。
そこで、アプリケーションがある程度になってきた場合は、モジュールという単位で分割して管理すると便利です。
モジュールとは、文字通り「部品」を意味する単語ですが、ZendFrameworkにおけるモジュールはそれ自体がMVCアプリケーションとなっています。
よく利用する機能などをモジュールとしてまとめておくことで、メンテナンス性が向上します。また、他のアプリケーションから呼び出すことが可能になり、再利用性もあがります。
モジュール利用時のディレクトリ構成
モジュールを利用するときはディレクトリ構成が既定の構成とは異なり、下記のような構成となります。
-application/
|_ modules/
|_ default/
| |- controllers/
| | |_ IndexController.php
| |- models/
| |_ views/
|
|_ blog/
| |- controllers/
| |- models/
| |_ views/
|
|_ news/
|- controllers/
|- models/
|_ views/
-/html (公開ディレクトリ)
|- .htaccess
|_ index.php
上記の場合、default / blog / news の3つがモジュールです。
前述したとおり、モジュールのディレクトリ内にそれぞれ モデル / ビュー / コントローラ のディレクトリをそれぞれ備えています。
モジュールのディレクトリ名はモジュールと同じに設定しておくとわかりやく、ベターです。
default は少し特殊なモジュールとなります。
default は文字通り、モジュール名の指定がない場合のデフォルトのモジュールとして動作します。
フロントコントローラでのコントローラフォルダの指定
モジュール構成を利用する場合は、フロントコントローラでモジュール名とそのモジュールのコントローラ格納ディレクトリを指定しておく必要があります。
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory(array(
'default' => 'pathto/modules/default/controllers',
'blog' => 'pathto/modules/blog/controllers',
'news' => 'pathto/modules/news/controllers'
));
setControllerDirectoryメソッドでは引数に"キー名=モジュール名"・"値=モジュールのコントローラ格納ディレクトリへのパス"の連想配列を渡します。
これでディスパッチャが正常にディスパッチできるようになります。
モジュール構成時のアクションコントローラの命名規則
モジュール構成を利用するときは、アクションコントローラの命名規則も変更されます。
具体的にはモジュール内のコントローラクラス名だけ特別な命名規則が必要で、他のファイル名などは既定の命名規則から変更はありません。
モジュール構成利用時のコントローラクラス名の形式は以下のとおりです。
| 命名規則 | 命名例 |
|---|---|
| モジュール名_コントローラ名 | Blog_IndexController News_IndexController |
このようにプレフィックスとしてモジュール名が利用され、_(アンダーバー)をはさみ、コントローラ名というクラス名になります。モジュール名の頭文字が大文字となっている点に注意してください。
なお、デフォルトのモジュールの場合はプレフィックスとしてつけるモジュール名は必要ありません。
つまり、default/controllersないのIndexController.php 内のクラス名は、"Default_IndexController"とはならず、"IndexController"となります。
モジュール構成時のリクエストURIの形式
デフォルトのルーティングでは、モジュール名をコントローラ名の前に記述する形式のURIになります。
http://localhost/<モジュール名>/<コントローラ名>/<アクション名>/
デフォルトモジュールにアクセスする場合はモジュール名を省略することができます。

この記事へのコメント
まだコメントは投稿されていません。