0

モジュール

注意: モジュールは version 1.0.3 以降でサポートされました。

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

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

1. モジュールの作成

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

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

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

ヒント: 新しいモジュールの基本的なスケルトンを作成するために yiic ツールを使用することができます。たとえば、上記した forum モジュールを 作るには、コマンドラインウィンドウで下記コマンドを実行します。

% cd WebRoot/testdrive
% protected/yiic shell
Yii Interactive Tool v1.0
Please type 'help' for help. Type 'exit' to quit.
>> module forum

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 のサブディレクトリにあるなら、 上記の ルート(道筋) フォーマットをまだ使用できます。 たとえば、PostController が forum/controllers/admin 下にある場合、 forum/admin/post/create を使用している create アクションを参照できます。

3. モジュールのネスト化

モジュールはネスト化することができます。 これは、モジュールが他のモジュールを含むことができるということです。 前者の 親モジュール を呼び出した上に、後者の 子モジュール を 呼び出します。子モジュールは親モジュールの modules ディレクトリ下に 配置されなければなりません。 子モジュールでコントローラアクションにアクセスするために、 ルート parentModuleID/childModuleID/controllerID/actionID を 使用しなければなりません。