[ステップアップ! CakePHP] Controller で Component を使う

No Photo

イメージ

こんにちは、ichikawaです。
本日より、新連載「ステップアップ! CakePHP」を開始します。
今回の連載は、「 CakePHP1.2 の基礎はだいたい分かるけど、いまいち使いこなせていない気がするんだよなー」といった方向けの連載となっています。
「本を読んだけど…」、「チュートリアルはやってみたけど…」そのままになっている方!
これを機会にステップアップをしてみませんか?
第一回は、「コントローラーでコンポーネントを使う」です。

Component (コンポーネント) とは?

コンポーネントとは、主にコントローラーの処理をサポートするものです。
複数のコントローラ間で共有したい機能などをコンポーネントとしてまとめる事により、簡単に共有でき、より開発効率が良くなります。

設置場所

app/controllers/components以下に配置します。

命名規則

ファイル名は、作成するコンポーネントクラスから「Component」を削除したコンポーネント名をcamel_case形式にしたものになります。
「TestComponent」の場合、「test.php」となります。

コアコンポーネントと自作コンポーネント

CakePHPには、既に用意されているコアコンポーネントの他に、自分でコンポーネントを作る事も可能です。
コアコンポーネントの使い方は、こちらなど参考になさってください(Authコンポーネント)
今回は簡単な自作のコンポーネントを作成して、実際にコントローラーから使ってみたいと思います。

自作コンポーネントの作り方

コンポーネントの基本構造は以下のようになります。 (公式マニュアルより引用

class MathComponent extends Object {

    function doComplexOperation($amount1, $amount2) {
        return $amount1 + $amount2;
    }

}

ここでは「Mathコンポーネント」という計算してくれるコンポーネントを例に挙げています。
あちこちのコントローラー内で使いたい機能は、このようにコンポーネント化することにより簡単に共有する事ができます。便利ですね!

コントローラ内でコンポーネントを読み込む

コンポーネントを作成したら、以下のようにコンポーネント名("Component" の部分は取り除きます)を指定してコントローラ内で使用することができます。
※ AppController 内で宣言されたコンポーネントは、他のコントローラ内のコンポーネントとマージされます。そのため同じコンポーネントを再度宣言する必要はありません。

class SimpleController extends AppController {

    var $components = array('Math');

}

MathコンポーネントのdoComplexOperationメソッドを使用したい場合には以下のようにします。

$result = $this->Math->doComplexOperation(1, 2);

コンポーネント内でコントローラーにアクセスする

コンポーネント内でコントローラのインスタンスにアクセスするには、initialize() または startup() メソッドを実行する必要があります。
initialize メソッドはコントローラの beforeFilter() メソッドの前に呼び出され、startup() はコントローラの beforeFilter() メソッドの後に呼び出されます。

class MathComponent extends Object {
    //コントローラの beforeFilter() メソッドの前に呼び出される。
    function initialize(&$controller) {
        $this->controller =& $controller;
    }

    //コントローラの beforeFilter() メソッドの後に呼び出される。
    function startup(&$controller) {
        // 処理
    }
}

コンポーネントから別のコンポーネントを使用する

コンポーネントでは、他のコンポーネントを使用する事もできます。
コントローラーと同様に、コンポーネントクラスの$componentsに使用するコンポーネント名を記述する事により、$this->[コンポーネント名]の形式でそのコンポーネントを使用できます。
以下は、Mathコンポーネント内でTestコンポーネントを使用している例です。

class MathComponent extends Object {
    var $name = "Math";
    var $components = array( "Test" );

    function getHoge(&$controller) {
        $this->Test->hoge();
    }
}

以上、コンポーネントのご紹介と使い方でした。
次回は「Model で Behavior を使う」です。お楽しみに!

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ