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()メソッド)