シェアする

  • このエントリーをはてなブックマークに追加

[CakePHP2]コンポーネントでloadModelできる便利メソッドを作る

自作のコンポーネントでモデルを使うときはどうしていますか?

コントローラでusesしているモデルであれば

class HogeComponent extends Component {
	public function initialize(Controller $controller) {
		$this->controller = $controller;
	}
	// コントローラでusesされたモデルを使う
	public function test() {
		$this->controller->{モデル名}->find(...);
	}
}

とこんな感じで使えますが、controllerと書かなければならない分記述が長くなるし、呼び出し元のコントローラでusesしていないとエラーになってしまいますよね。

なので、最近は自作のコンポーネントに以下のようなメソッドを作って利用しています。

private function loadModel($modelName) {
	if (!empty($this->controller->{$modelName})) {
	// 呼び出し元のコントローラでusesしてあれば$this->{モデル名}に参照渡し
		$this->{$modelName} = $this->controller->{$modelName};
	} else {
	// コントローラでusesしていなければコンポーネントでモデルを読み込む
		App::uses($modelName, 'Model');
		$this->{$modelName} = new $modelName;
	}
}

コントローラのloadModelと同じように使えるので便利*[1]です。

8/26追記

すでに$this->{モデル名}が存在する場合に対応

private function loadModel($modelName) {
	if (!empty($this->{$modelName})) {
	// すでに存在すればそのままreturn
		return;
	} elseif (!empty($this->controller->{$modelName})) {
	// 呼び出し元のコントローラでusesしてあれば$this->{モデル名}に参照渡し
		$this->{$modelName} = $this->controller->{$modelName};
	} else {
	// コントローラでusesしていなければコンポーネントでモデルを読み込む
		App::uses($modelName, 'Model');
		$this->{$modelName} = new $modelName;
	}
}
  1. 正しいのかどうかは別として []

シェアする

  • このエントリーをはてなブックマークに追加

フォローする