CakePHP2でコンポーネントからモデルを呼びたいとき。
まぁ、Cakeの規約的にはコントローラー呼び出し元でデータを渡せってことなんだろうけど、
複数のコントローラーで使いたいときにいちいち同じコードをコントローラーで書くのはあま
り利口じゃないので、コンポーネントでモデル呼び出ししたほうがスマートに書けるんですよね…。
というわけで方法
< ?php
App::uses('Component', 'Controller');
class HogeComponent extends Component {
public $uses = array('User'); //ここに使うモデルを列記
function startup(Controller $controller){
foreach($this->uses as $model){
if(empty($this->{$model})){
if(!empty($controller->{$model})){
$this->{$model} = $controller->{$model};
}else{
App::uses($model, 'Model');
$this->{$model} = new $model;
}
}
}
}
/**
* Shellなどからの呼び出しの場合はこっちを手動でコールして初期化
*/
function init(){
foreach($this->uses as $model){
if(empty($this->{$model})){
App::uses($model, 'Model');
$this->{$model} = new $model;
}
}
}
}
initialize()とかstartup()の引数になってる$controllerは呼び出し元のコントローラーのオブジェクトが入っているので
そこからなら呼べる。
というわけで初期化時にそこからコンポーネントのほうにコピーしちゃう。
これで
$this->User->find(); が呼べるようになります。
呼び出し元でロードしてある場合はそっちを流用、ない場合は新規でオブジェクト化します。
ちなみに、同名のメソッドがあるとダメですがね。
一般的なコントローラーからの呼び出しであればこれでOK。
なんですが、Shellから使った場合はstartup()はなんとinitialize()もコールされないので別で初期化が必要です(init()メソッド)
