[ステップアップ! CakePHP] Controller で Component を使う
こんにちは、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 を使う」です。お楽しみに!