CakePHP1.3でヘルパーからコンポーネントを使えるようにする方法

まえがき

ヘルパーからコンポーネントを使えるようにする方法です。
Authコンポーネントのデータをヘルパーが自動で読み込んで表示したり出来たら便利そうです。
ただ、デフォルトでコンポーネントの参照をヘルパーに渡していないところを見ると、CakePHPの設計思想上問題があるように見えます。
まあやってしまった以上もとに戻すのも面倒ですから、この点に関しては見て見ぬ振りをしておきましょう

実現方法

ヘルパーからコンポーネントを使えるようにするには、
1,Viewクラスを継承したAppViewクラスのインスタンスコンポーネントの参照をセットした後、
2,コントローラにAppViewを使うようにセット、
3,ヘルパーからViewインスタンスへの参照を得る、
という流れで実現します。
これはCakePHPは1.3になってから、この方法が使えなくなったためです。


まずは、Viewにコンポーネントへの参照をセットします。
Viewクラスを継承したAppViewクラスを作成します。

<?php
class AppView extends View {

    //コンポーネントのインスタンスを保持する
    private $conponents;

    function __construct(&$controller, $register = true)
    {
        //コントローラのインスタンスから参照を受け取る
        $this->conponents = $controller->Component;
	parent::__construct($controller);
    }

    //getメソッド
    public function &getConponents()
    {
        return $this->conponents->_loaded;
    }

}
?>


次に、コントローラにAppViewを使うようにセットします。
ここでは一括でセットするためにAppControllerにセットしています。

<?php
class AppController extends Controller {

    //ここに指定します
    var $view = "App";

    function index()
    {
        return;
    }

}
?>


最後にヘルパー内でViewインスタンスをセットします
コールバックメソッドの挙動の詳しい説明は「ヘルパーのコールバックメソッドを調査しました」

<?php
class Use_Conponent_From_Helper extends AppHelper {

    //コンポーネントのインスタンスを保持する
    private $conponents;

    //.ctpファイルの実行前にViewインスタンスを取得してコンポーネントへの参照をセットしておく
    function beforeRender()
    {
        //Viewのインスタンスを取得
        $view = ClassRegistry::getObject('view');
        //Viewが保持するコンポーネントの参照をプライベートプロパティに保持します
        $this->conponents = $view->getConponents();
    }

}

以上でヘルパーからコンポーネントを使うようになりました