コンポーネントから自動でモデルを呼び出す

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

タイトルとURLをコピーしました