モジュール

モジュールは、モデルビューコントローラ およびその他の支援的コンポーネントから構成される自己完結したソフトウェアユニットです。 多くの面でモジュールは、 アプリケーション に似ています。 主な違いは、モジュールは単独では配置されず、アプリケーションの内部に存在しなければならないという点です。 ユーザは、通常のアプリケーションのコントローラにアクセスするように、モジュールのコントローラにアクセスすることができます。

モジュールはいくつかのシナリオで役立ちます。 大規模アプリケーションでは、いくつかのモジュールに分け、各々独立して開発・保守されるかもしれません。 ユーザ管理やコメント管理のような一般的に用いられる機能は、将来のプロジェクトで簡単に再利用できるように、モジュールとして開発されるかもしれません。

1. モジュールの作成

モジュールはユニークな ID となる名前のディレクトリ下にまとめられます。 モジュールのディレクトリ構成は、アプリケーションベースディレクトリ と似ています。 以下に、forum という名前のモジュールのディレクトリ構成を示します:

forum/
   ForumModule.php            モジュールクラスファイル
   components/                再利用可能なユーザコンポーネントを含む
      views/                  ウイジェットのためのビューを含む
   controllers/               コントローラクラスファイルを含む
      DefaultController.php   デフォルトコントローラクラスファイル
   extensions/                サードパーティのエクステンションを含む
   models/                    モデルクラスファイルを含む
   views/                     コントローラビューとレイアウトファイルを含む
      layouts/                レイアウトビューファイルを含む
      default/                デフォルトコントローラのビューファイルを含む
         index.php            インデックスビューファイル

モジュールは CWebModule より継承されたモジュールクラスを持つ必要があります。 クラス名は ucfirst($id).'Module' という式を用いて決定します ($id はモジュール ID、または、モジュールのディレクトリ名です)。 モジュールクラスは、モジュールコード間で共通して使用される情報を格納する中心部分となります。 たとえば、モジュールパラメータを格納するために CWebModule::params を使用し、 モジュールレベルで アプリケーションコンポーネント を共有するために CWebModule::components を使用することができます。

ヒント: 新しいモジュールの基本的なスケルトンを作成するために Gii のモジュールジェネレータを使うことができます。

2. モジュールの使用

モジュールを使用するには、まず アプリケーションベースディレクトリmodules ディレクトリの下に、そのモジュールのディレクトリを配置します。 次に、アプリケーションの modules プロパティで、モジュール ID を宣言します。 たとえば、上記 forum モジュールを使用するために、アプリケーション初期構成 で下記のように記述します。

return array(
    ......
    'modules'=>array('forum',...),
    ......
);

モジュールは初期プロパティ値によって構成することも可能です。 方法は、アプリケーションコンポーネント の設定と非常に似ています。 たとえば、forum モジュールがそのモジュールクラス中に postPerPage という名前のプロパティを持っていれば、 下記のように アプリケーション初期構成 の中で設定できます。

return array(
    ......
    'modules'=>array(
        'forum'=>array(
            'postPerPage'=>20,
        ),
    ),
    ......
);

モジュールのインスタンスは、現在のアクティブなコントローラ内の module プロパティによってアクセスできます。 そして、モジュールインスタンスを通じて、モジュールレベルで共有されている情報にアクセスすることができます。 たとえば、上記の postPerPage 情報にアクセスするために、下記の式を使用できます:

$postPerPage=Yii::app()->controller->module->postPerPage;
// もしくは、もし $this がコントローラインスタンスを参照するなら下記のように
// $postPerPage=$this->module->postPerPage;

モジュールのコントローラアクションは ルート (経路) moduleID/controllerID/actionID を使用してアクセスできます。 たとえば、上記の forum モジュールが PostController という名前のコントローラを持っていれば、このコントローラの create アクションを参照するために、ルート (経路) forum/post/create を使用できます。 このルートに対応する URL は http://www.example.com/index.php?r=forum/post/create になります。

ヒント: コントローラが controllers のサブディレクトリにある場合でも、上記の ルート (経路) の形式を引き続いて使用できます。 たとえば、PostControllerforum/controllers/admin 下にある場合、forum/admin/post/create を使用して create アクションを参照できます。

3. ネストしたモジュール

モジュールは何段階でもネストすることができます。 すなわち、モジュールが別のモジュールを含み、そのモジュールがさらに別のモジュールを含む、という事が可能です。 含む側を 親モジュール と呼び、含まれる側を 子モジュール と呼びます。 子モジュールは、親モジュールの modules プロパティの中で宣言されなければなりません。 上記で示したアプリケーション初期構成の中でモジュールを宣言したのと同じです。

子モジュールのコントローラアクションにアクセスするためには、ルート parentModuleID/childModuleID/controllerID/actionID を使用しなければなりません。

$Id$

Be the first person to leave a comment

Please to leave your comment.