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変数がサポートされていないのはなんかしっくり来ないですね。