題名の通りです。
色々方法はあるみたいですが、自分の中でしっくりきたのをメモ。
まずはモデルのほう。
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変数がサポートされていないのはなんかしっくり来ないですね。