[CakePHP]1.2系でヘルパーからコンポーネントへアクセスする方法

まず1.1系では

例えば HogeComponent にアクセスしたいヘルパーに

$this->view->controller->HogeComponent->method();

というように書けば、HogeComponent の method にアクセスできる。
CakePHP ヘルパーからコンポーネントへのアクセス方法 | Sun Limited Mt.
というように書くことが出来ます。
1.1系ではヘルパーにはビュークラスのインスタンス($view)、ビューにはコントローラクラスのインスタンス($controller)がセットされていたので上記が可能でした。

1.2系では
一方、1.2系(Beta 1.2.0.6311)では、

      • ヘルパーにはビュークラスのインスタンスがセットされていない。
      • ビューにはコントローラクラスのインスタンスがセットされていない。

というように変更されていたので、1.1系の方法ではアクセスできませんでした。

解決策
やり方は色々あると思いますが、Viewクラスの配列変数$__passedVarsにコントローラで使われている変数名をセットすると、コントローラからビューへ変数が引き継がれる仕組みを利用しました。
コアのViewクラスを触りたくないので、Viewクラスを継承したクラスを使うようにしました。
【app/views/app.php】

<?php
class AppView extends View {

function __construct(&$controller, $register = true) {
// コンポーネントを全てセットする
foreach ( $controller->components as $component ){
$this->__passedVars[] = $component;
}
parent::__construct($controller);
}
}
?>

次にAppControllerクラスで、ビューに上記AppViewクラスを使用するようにセットします。
【app/controllers/app_controller.php】

<?php
class AppController extends Controller {
$view = 'App'; // AppView
$components = array('Hoge'); // HogeComponent
}
?>

ここまでで、ビューにコンポーネントがセットされるようになりました。
最後に任意のヘルパーの中でHogeComponentへアクセスするには、

$view = ClassRegistry::getObject('view');
$view->Hoge;

というように、まずClassRegistryからビュークラスのインスタンスを取り出すことで可能です。
オマケ
上記の構成にしておけば、テンプレートの中でHogeComponentへは

$this->Hoge;

でアクセスできます。