CakePHP2.xでモデル中から他のモデルやコンポーネントを呼び出す

題名の通りです。

色々方法はあるみたいですが、自分の中でしっくりきたのをメモ。

まずはモデルのほう。

AppModel.phpに

public function loadModel($modelClass) {
if (!isset($this->{$modelClass})) {
$this->{$modelClass} = ClassRegistry::init(array('class' => $modelClass, 'alias' => $modelClass, 'id' => null));
}
}

を追記。

こうすれば、コントローラー中で$this->loadModelした時と同じ挙動が得られます。

インスタンス変数にする必要性はあまりありませんが、リファクタリングなどでコントローラーからモデルへコードを移したときに修正箇所が少なくて済むので、私はこうしてます。

次はコンポーネント。

同じくAppModel.php内に

public function loadComponent($componentClass, $settings = array()) {
if (!isset($this->{$componentClass})) {
if (!isset($this->Components)) {
$this->Components = new ComponentCollection();
}
App::uses($componentClass, 'Controller/Component');
$this->{$componentClass} = $this->Components->load($componentClass, $settings);
}
}

を追記。

$this->loadComponent('HogeComp');

などとすれば読み込まれます。

試していませんが、AppShell.php内にも使えると思います。その場合はclass定義の前あたりに

App::uses('ComponentCollection', 'Controller');

が必要になりますね。

シェルで$components変数がサポートされていないのはなんかしっくり来ないですね。