App:usesとApp::importとClassRegistry::init();がある。
使い方
import
App::import('Model','KeiyakuList');
$KeiyakuList = new KeiyakuList;
$res = $KeiyakuList->find('all');
uses
App::uses('KeiyakuList','Model');
$KeiyakuList = new KeiyakuList;
$res = $KeiyakuList->find('all');
App:usesとApp::importは引数が逆なので注意!
ClassRegistry
$KeiyakuList = ClassRegistry::init('KeiyakuList');
$res = $KeiyakuList->find('all');
どれ使うか?
何が適するかは人それぞれだと思う。
ちなみに自分は、モデルが規約通りなのと、遅延ロードでパフォーマンスが優れているのでApp::usesを使っている。
また、ClassRegistryはインスタンスが生成済みであれば、生成済みのインスタンスを返す。いわゆるGoFのシングルトン形式でインスタンスを生成している。なので違う性質のインスタンスをいくつか作る場合は適していない。
インスタンス生成用のメソッドを作る
AppModelあたりに生成用の関数を作る。
パラメータのモデル名を受けて、importしてnewして、プロパティに設定する。
一工夫でarrayのキャストを使って、パラメータが文字列でも配列でもいいようにしている。
AppModel
public function loadModel($model_list) {
foreach((array)$model_list as $model){
App::uses($model,'Model');
$this->{$model} = new $model();
}
}
各モデルのメソッドからはこんな感じで使う。
各モデル
//生成するモデルがひとつの場合
$this->loadModel('Foo');
$this->Foo->find('all');
//生成するモデルが複数の場合
$this->loadModel(['Foo','Bar']);
$this->Foo->find('all');
$this->Bar->find('all');